Левое присоединение - PullRequest
       5

Левое присоединение

0 голосов
/ 27 сентября 2018

У меня есть маленький запрос ниже.# 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

По логике левого соединения должны отображаться все записи из левой таблицы и только совпадающие записи из правой таблицы.Почему я вижу «Credited» во второй строке, если в # t1 такой записи не существует?

желаемый вывод:

enter image description here

Я скучаю по чему-то глупому и не могу понять.Любая помощь?!

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

Вы, очевидно, хотите присоединиться к 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;
0 голосов
/ 28 сентября 2018

Я не думаю, что вы можете получить такой вывод с данными и состоянием соединения, которое у вас есть.Вы соединяете # t1 с # t2 с помощью cid, и у вас есть одинаковый cid для обеих записей в таблице # t2, это означает, что одна запись из # t2 с cid 1001 будет присоединена к обеим записям в таблице # t2.

Вы можете получить такой вывод, если вы измените идентификатор второй строки в # t1 на 1002, но я не знаю, является ли он правильным для вашей задачи.

0 голосов
/ 28 сентября 2018

Если вы хотите показывать Credited только там, где указана EndDate, вам нужно добавить к вашему условию соединения.

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

Если это происходит с помощью идентификатора посещения, а не EndDate, используйте этоquery:

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

У нас сейчас недостаточно информации, чтобы действительно знать, чего требует ваша логика, но она, вероятно, будет выглядеть примерно так, как указано выше.

0 голосов
/ 27 сентября 2018

Вы видите ожидаемое поведение.Вы присоединяетесь к CID.Отдельная запись в # t2 имеет значение CID 1001. Это соответствует обе записи в # t1, поскольку обе записи в # t1 имеют значение 1001;таким образом, в ваших результатах есть две строки со значением Credited для ответа столбца.

...