我有这两个SQL语句,我需要做的是将它们连接到一个语句中,但是当我这样做时,结果是不合适的。:/
select
nieruchomosci.nieruchomoscnr, count(wynajecia.nieruchomoscNr) as wynajecia
from
nieruchomosci, wynajecia
where
nieruchomosci.nieruchomoscnr = wynajecia.nieruchomoscNr
GROUP BY
nieruchomosci.nieruchomoscnr;
select
nieruchomosci.nieruchomoscnr, count(wizyty.nieruchomoscnr) as wizyty
from
nieruchomosci, wizyty
where
wizyty.nieruchomoscnr = nieruchomosci.nieruchomoscnr
GROUP BY
nieruchomosci.nieruchomoscnr;
这就是我加入他们的方式:
select
nieruchomosci.nieruchomoscnr,
count(wynajecia.nieruchomoscNr) as wynajecia,
count(wizyty.nieruchomoscnr) as wizyty
from
nieruchomosci, wynajecia, wizyty
where
nieruchomosci.nieruchomoscnr = wynajecia.nieruchomoscNr
and wizyty.nieruchomoscnr = nieruchomosci.nieruchomoscNr
GROUP BY
nieruchomosci.nieruchomoscnr;
这样,“ wynajecia”和“ wizyty”中的数字相同,这是错误的。:/
编辑:
有了这段代码,我得到:
A14 8 8
B16 6 6
B17 4 4
B18 4 4
B21 4 4
G01 6 6
L94 10 10
正确的输出应为:
A14 2 4
B16 3 2
B17 2 2
B18 2 2
B21 2 2
G01 3 2
L94 2 5
我设法通过以下代码获得正确的答案:
select nieruchomosci.nieruchomoscnr,
(select count(wynajecia.nieruchomoscNr) from wynajecia where wynajecia.nieruchomoscNr = nieruchomosci.nieruchomoscnr) as wynajecia,
(select count(wizyty.nieruchomoscNr) from wizyty where wizyty.nieruchomoscNr = nieruchomosci.nieruchomoscnr) as wizyty
from nieruchomosci
但是我不是,这是解决问题的正确方法。
考虑以下场景:
TableA记录的ID:{1、2、3、4、5},
TableB记录的ID:{1、2、3、5},
TableC记录的ID:{1、4、5}
从TableA a到TableA b的连接(a.ID = b.ID)的select *结果为{1,2,3,5}
从TableA a select TableC c on(a.ID = c.ID)选择*的结果是{1、4、5}
从TableA a(a.ID = b.ID)上的联接TableB b到(a.ID = c.ID)上的联接TableC c的select *结果为{1,5}
因此,如果您在分组依据之后进行计数或计数,则记录将有所不同。
作为您的代码,您可以使用左连接和sum(case end)作为以下代码:
select
nieruchomosci.nieruchomoscnr,
sum(case when wynajecia.nieruchomoscNr is null then 0 else 1 end) as wynajecia,
sum(case when wizyty.nieruchomoscnr is null then 0 else 1 end) as wizyty
from
nieruchomosci
left join
wynajecia on (nieruchomosci.nieruchomoscnr = wynajecia.nieruchomoscNr)
left join
wizyty on (wizyty.nieruchomoscnr = nieruchomosci.nieruchomoscNr)
GROUP BY
nieruchomosci.nieruchomoscnr;
除了您的问题更新:
现在,您有了具有记录ID的TableA:{1、2、3、4}
表B是
TableAID Value
1 B1-1
1 B1-2
2 B2-1
2 B2-2
4 B4-1
4 B4-2
表C为
TableAID Value
1 C1-1
1 C1-2
1 C1-3
3 C3-1
3 C3-2
4 C4-1
三张表联接的结果
select * from TableA a join TableB b on (a.ID = b.ID) join TableC c on (a.ID = c.ID)
是
TableAID TableB_Value TableC_Value
1 B1-1 C1-1
1 B1-1 C1-2
1 B1-1 C1-3
1 B1-2 C1-1
1 B1-2 C1-2
1 B1-2 C1-3
4 B4-1 C4-1
4 B4-2 C4-1
因此,您得到了Count(B.Value):{1-> 6,4-> 2},Count(C.Value)相同。您需要的是Count(B.Value):{1->
2,2-> 2,4-> 2}和Count(C.Value):{1-> 3,3-> 2,4- > 1}
您更新的代码是正确的。但是为了获得更好的性能,您可以使用以下代码:
select nieruchomosci.nieruchomoscnr, ifnull(wynajecia.wynajecia_count, 0) as wynajecia_count, ifnull(wizyty.wizyty_count, 0)
from nieruchomosci
left join
(select wynajecia.nieruchomoscNr, count(*) as wynajecia_count from wynajecia group by wynajecia.nieruchomoscNr) as wynajecia
on (wynajecia.nieruchomoscNr = nieruchomosci.nieruchomoscnr)
left join
(select wizyty.nieruchomoscNr, count(*) as wizyty_count from wizyty group by wizyty.nieruchomoscNr) as wizyty
on (wizyty.nieruchomoscNr = nieruchomosci.nieruchomoscnr)
“ ifnull”功能适用于mysql。对于Oracle,它应该是“ nvl”,对于MS SQL,它应该是“ isnull”。
问题内容: 当我的SQL语句中只有一个内部联接时,它可以很好地工作。我尝试加入第二张表,现在出现一个错误,提示存在语法错误(缺少运算符)。这是怎么了 问题答案: 对于多表联接,您必须将多余的联接嵌套在方括号中: 基本上,对于除第一个表之外的所有其他表,都需要在原始“ FROM”表之前加上一个括号,并在匹配的JOIN“ on”子句上使用一个结束括号。
问题内容: 我想知道每个连接可以同时打开多少个语句或preparedstatement。我真的不明白,如果执行多个语句并检索到多个结果集,它将如何工作。具有详细信息的资源链接将很有帮助。 谢谢 问题答案: 可以在同一连接上创建和使用多个语句,但是一次只能在一个语句上创建和使用 一个 结果集。如果您通过同一条语句创建/打开另一个,则任何先前打开的结果集将被隐式关闭,从而导致任何尝试访问它的“ Res
我正在尝试更新一个名为< code>incode_warrants的表,并将< code>warn_docket_no设置为< code>incode_violations表中的< code>viol_docket_no。 我在Postgres 9.3中有以下SQL查询,但当它触发时,我得到以下错误: 我更像是一个主动记录的人,所以我的原始SQL技能严重不足。我想知道是否有人可以帮助我指出正确的方
我需要将priorityId设置为以下。有人能建议一个sql更新语句吗?我想我需要一个由Rid和Gid组成的组或自加入 非常感谢。
问题内容: 什么是 MySQL的等效 的声明,其中列出了当前连接或指定连接的SQL语句? 问题答案: 使用SHOW PROFILES查看发送到MySQL的最新语句的列表: 如果您希望/需要查看当前正在运行的查询,请使用SHOW PROCESSLIST : 该关键字意味着列表将包括所有客户端的查询,不只是你在运行该命令的一个。
单例准备好的语句会比每次创建一个语句更好吗?