Я хочу соединить две таблицы, но показывает одно из значений таблицы NULL.Должен ли я использовать правильное внешнее соединение? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть Таблица1:

IdT1, IdT1Group

11, 30

12, 30

13, 30

Таблица 2:

IdT2, IdT1, подробности

2, 11, A

3, 11, B

4, 12, A

5, 12, B

Я ожидаю, что мой запрос будет:

IdT2, IdT1, Detail

2, 11, A

3, 11, B

2, 12, A

3, 12, B

NULL, 13,A

NULL, 13, B

Итак, я использую Cross Join:

SELECT  table2.IdT2, 
        table1.IdT1, table2.Detail
FROM    table2 CROSS JOIN table1
WHERE   table2.IdT1 = 11 AND table1.IdT1Group = 30

Но после того, как я попробовал свой код, это было:

IdT2    IdT1    Detail

2   ,   11  ,   A

3   ,   11  ,   B

2   ,   12  ,   A

3   ,   12  ,   B

2   ,   13  ,   A

3   ,   13  ,   B

Вот как это должно быть:

IdT2, IdT1, Detail

2   ,   11 ,    A

3   ,   11 ,    B

2   ,   12 ,    A

3   ,   12 ,    B

NULL , 13  ,    A

NULL , 13  ,    B

Если я использую этот запрос:

SELECT  T2.IdT2, tblJoin.IdT1, tblJoin.Detail

FROM    Table2 AS T2 RIGHT JOIN
    (SELECT Table2.IdT2, 
            Table1.IdT1, Table2.Detail 
     FROM   Table2 CROSS JOIN Table1 WHERE  Table2.IdT1 = 11 AND Table1.IdT1Group = 30
    )   AS tblJoin ON T2.IdT1 = tblJoin.IdT1 And T2.IdT2 = tblJoin.IdT2 ORDER BY IdT2

Результат будет:

IdT2, IdT1, деталь

NULL, 12, A

NULL, 12, B

NULL, 13, A

NULL, 13, B

2, 11, A

3, 11, B

, если данные в таблице 2:

IdT2, IdT1, Деталь

2, 11, А

3, 11, В

4, 11, С

5, 12, А

6, 12,B

, Данные выбора, которые я ожидаю, будут:

IdT2;IdT1;Деталь

2, 11, A

3, 11, B

4, 11, C

2, 12, A

3, 12, B

NULL, 12, C

NULL, 13, A

NULL, 13, B

NULL, 13, C

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

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

WITH Table1( IdT1, IdT1Group)
AS
(
    SELECT 11, 30 UNION ALL
    SELECT 12, 30 UNION ALL
    SELECT 13, 30
),
Table2(IdT2 , IdT1, Detail)
AS
(
    SELECT 2 , 11 , 'A' UNION ALL
    SELECT 3 , 11 , 'B' UNION ALL
    SELECT 4 , 12 , 'A' UNION ALL
    SELECT 5 , 12 , 'B'
)

SELECT D.IdT2,C.IdT1,C.Detail FROM 
(
    SELECT IdT1, Detail FROM 
    (
        SELECT DISTINCT 1 JK,Detail FROM Table2
        -- Return DISTINCT LIST of Details as I seen 
        -- You established relation between all Distinct Details
        -- With All Number. JK (Joined Key) = 1 Generated so that 
        -- I can join both table by that number to create all to 
        -- all combination
    )A
    INNER JOIN 
    (
        SELECT 1 JK,* FROM Table1
        -- JK (Joined Key) = 1 Generated so that I can join 
        -- both table by that number to create all to all combination
    )B ON A.JK = B.JK
)C
LEFT JOIN Table2 D ON C.IdT1 = D.IdT1 AND C.Detail = D.Detail
ORDER BY 2

Выход -

IdT2    IdT1    Detail
2       11      A
3       11      B
5       12      B
4       12      A
NULL    13      A
NULL    13      B
0 голосов
/ 21 июня 2019

Исходя из того, что я вижу здесь с вашим набором результатов, вы, вероятно, хотите что-то близкое к этому.Хотя это сложно без особого контекста.Посмотрите, приближает ли это вас к тому, что вы хотите:)

SELECT t2.IdT2, t1.IdT1, d.Detail 
FROM Table1 t1
LEFT OUTER JOIN Table2 t2 ON t1.IdT1 = t2.IdT1
CROSS JOIN (SELECT Detail FROM Table2 WHERE idT1=11 ) d
WHERE t1.IdT1Group=30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...