我有这两个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”。