我在下面有一个小查询。 #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
输出为:
按照左连接的逻辑,应该显示左表中的所有记录,并且仅显示右表中的匹配记录。当#t1中没有这样的记录时,为什么在第二行中看到“已贷记”?
所需的输出:
我错过了一些愚蠢的事情,无法弄清。有帮助吗?!
答案 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
我们目前没有足够的信息来真正了解您的逻辑要求,但可能看起来像上面的事情。