左联接行为

时间:2018-09-27 20:55:09

标签: sql sql-server left-join

我在下面有一个小查询。 #t1和#t2是2张小桌子。我试图对这两个表进行简单的左联接,然后看到输出。

查询:

    create table #t1 (cid int, program varchar(20), PP varchar(20), Startdate date, enddate date,codeset varchar(20),visitID int)
insert into #t1
values
(1001,'P1','ORD','2018-09-27','2018-09-28','OL',150),
(1001,'P2','ORD','2018-09-29',NULL,'IR',151)

create table #t2 (cid int,visitID int, answer varchar(20))
insert into #t2 
values
(1001,150,'Credited')

select t1.cid, t1.Startdate, t1.Enddate,t2.answer
from #t1 t1
left join #t2 t2 on  t1.cid = t2.cid 

drop table #t1, #t2

输出为:

enter image description here

按照左连接的逻辑,应该显示左表中的所有记录,并且仅显示右表中的匹配记录。当#t1中没有这样的记录时,为什么在第二行中看到“已贷记”?

所需的输出:

enter image description here

我错过了一些愚蠢的事情,无法弄清。有帮助吗?!

4 个答案:

答案 0 :(得分:3)

您正在看到预期的行为。您正在加入CID。 #t2中的单个记录的CID值为1001。由于#t1中的两个记录的值均为1001,因此它与#t1中的两个记录都匹配。因此,结果中有两行,列答案的值是Credited。

答案 1 :(得分:1)

您显然想加入cid visitid

SELECT t1.cid,
       t1.startdate,
       t1.enddate,
       t2.answer
       FROM #t1 t1
            LEFT JOIN #t2 t2
                      ON t1.cid = t2.cid
                         AND t1.visitid = t2.visitid;

答案 2 :(得分:0)

我认为您无法获得具有数据和连接条件的输出。您正在通过cid将#t1与#t2连接,并且#t2表中的两个记录都具有相同的cid,这意味着#t2中cid为1001的一条记录将被连接到表#t2中的两个记录。

如果将#t1中第二行的ID更改为1002,则可以得到这样的输出,但是我不知道它是否适合您的任务。

答案 3 :(得分:0)

如果只想在指定了EndDate的地方显示Credited,则需要添加加入条件。

select t1.cid, t1.Startdate, t1.Enddate,t2.answer
from #t1 t1
left join #t2 t2 on  t1.cid = t2.cid AND t1.EndDate IS NOT NULL

如果是导致访问的原因是visitID而不是EndDate,请使用以下查询:

select t1.cid, t1.Startdate, t1.Enddate,t2.answer
from #t1 t1
left join #t2 t2 on  t1.cid = t2.cid AND t1.visitId = 150

我们目前没有足够的信息来真正了解您的逻辑要求,但可能看起来像上面的事情。