присоединиться к различным столбцам в SQL Server - PullRequest
1 голос
/ 09 апреля 2019

У меня есть главная таблица ниже Table1:

Name                ID      Entry_Dt
PEREZ               2000        8/14/2014 
PEREZ               2000        8/29/2017 
Domingo             2098        8/29/2017 

У меня есть еще одна таблица2 ниже:

kid_id  Parent_id   
2098    2000        

Мне бы хотелось, чтобы мой результат был таким:

Name     Kid_id     Parent_id   Entry_dt
PEREZ               2000        8/14/2014
PEREZ               2000        8/29/2017
Domingo   2098                  8/29/2017

Я использовал два разных метода, как пример ниже, но результат не желателен.

1: метод объединения

select *
FROM Table1 A INNER JOIN Table2 b
ON A.ID= B.Kid_id
union
select *
FROM Table1 A INNER JOIN Table2 b
ON A.ID= B.Parent_id

2: метод левого соединения:

select *
FROM Table1 A LEFT JOIN Table2 b
ON (A.ID= B.Kid_id or A.ID = B.Parent_id)

Почему мои методы не работают? Есть идеи по улучшению?

Ответы [ 4 ]

1 голос
/ 09 апреля 2019

Вы должны связать два различных JOINs, первое - LEFT JOIN для родителя (если существует), а второе - LEFT JOIN для ребенка (если существует).

Таким образом, вы выставляете в списке полей kind_id / parent_id как два разных столбца

Попробуйте это:

SELECT main.name, main.id, kid.Kid_id, parent.parent_id, main.Entry_dt
FROM Table1 main
LEFT JOIN Table2 kid
ON main.id = kid.Kid_id
LEFT JOIN Table2 parent
ON main.id = parent.Parent_id

См. SQL Fiddle

0 голосов
/ 09 апреля 2019

Вы можете достичь этого, дважды соединяя table2 с table1.один как родитель, а другой как ребенок.

Запрос

select table1.name, table1.ID, parent.parent_Id, kid.kid_id,table1.Entry_dt
from table1
left join table2 parent on parent.parent_Id = table1.id
left join table2 kid on kid.kid_id = table1.id

Вывод

enter image description here

0 голосов
/ 09 апреля 2019

Вам не нужно ЛЕВОЕ СОЕДИНЕНИЕ здесь - вы также можете сделать ВНУТРЕННЕЕ СОЕДИНЕНИЕ.Смысл LEFT JOIN - это когда вам нужны строки в одной таблице, которых нет в другой, но здесь каждая строка в Table1 имеет совпадение в Table2.Вам нужно использовать ИЛИ в условии соединения.

Чтобы получить желаемый результат, вам нужно выполнить некоторую работу по вашему выбору.См. Пример:

SELECT A.Name,
       CASE
           WHEN A.ID = B.Parent_Id THEN
               A.ID
           ELSE
               ''
       END AS ID,
       CASE
           WHEN A.ID = b.Kid_Id THEN
               b.Kid_Id
           ELSE
               ''
       END AS Kid_Id,
       CASE
           WHEN A.ID = b.Parent_Id THEN
               b.Parent_ID
           ELSE
               ''
       END AS Parent_Id,
       A.Entry_Dt
FROM Table1 A
    INNER JOIN Table2 b
        ON (
               A.ID = b.Kid_id
               OR A.ID = b.Parent_id
           );

Пример скрипта SQL

0 голосов
/ 09 апреля 2019

Вы должны использовать левое соединение

select A.Name, A.ID,  B.kid_id, B.Entry_dt
FROM Table1 A 
LEFT JOIN Table2 B   ON A.ID= B.Kid_id
...