2015-09-11 2 views
1

Я пытаюсь присоединиться к двум таблицам в MS SQL, но мне нужно присоединиться к неиспользуемым строкам.таблицы left join, используйте только одну строку из левой таблицы

Пример:

table1    table2 
key - value |  key - value 
1 - 1  |  1 - 1 
2 - 2  |  2 - 1 
3 - 3  |  3 - 3 
4 - 3  |  4 - 4 

SQL код

select * from table1 
left outer join 
(
    select * from 
    (
     select *, row_number() over(partion by value order by key) as rwno 
     from table2 
    ) as t2 
    where rwno = 0 -- this eliminates first two rows in table2 
) as tab2 
on 
    table1.key = tab2.value 

этот запрос возвращает

table1.key - table1.value - tab2.key - tab2.value 
1   - 1    - 1   - 1 
2   - 2    - null  - null 
3   - 3    - 3   - 3 
4   - 3    - 3   - 3 

В этом возвращении используется дважды строку 3 из table2

я должен ответить, как (без двуличия)

table1.key - table1.value - tab2.key - tab2.value 
1   - 1    - 1   - 1 
2   - 2    - null  - null 
3   - 3    - 3   - 3 
4   - 3    - null  - null 

Есть ли возможность достичь этого возвращения с использованием MS SQL запроса.

+0

Почему не должно быть соответствия, где ключ = 4, он кажется уникальным для меня? –

+0

это значение из таблицы2 уже использовалось в строке 3. –

ответ

1

Чтобы предотвратить присоединение повторяющиеся строки снова, вам нужно присвоить им номер и присоединиться на этот номер, как это, может почти обещаю, что это не будет хорошо работать на огромном столе:

DECLARE @table1 table([key] int, value int) 
DECLARE @table2 table([key] int, value int) 

INSERT @table1 
VALUES(1,1),(2,2),(3,3),(4,3) 

INSERT @table2 VALUES(1,1),(2,1),(3,3),(4,4) 

;WITH CTE1 as 
(
    SELECT 
    *, 
    row_number() over(partition by value order by [key]) secondkey 
FROM @table1 
), CTE2 as 
(
    SELECT *, 
    row_number() over(partition by value order by [key]) secondkey 
    FROM @table2 
) 
SELECT 
    CTE1.[key], CTE1.value, CTE2.[key], CTE2.[value] 
FROM CTE1 
LEFT JOIN 
    CTE2 
ON 
    CTE1.[key] = CTE2.value 
    and CTE1.secondkey = CTE2.secondkey 

Результат:

key value key value 
1 1  1 1 
2 2  NULL NULL 
3 3  3 3 
4 3  NULL NULL 
+0

Спасибо, это решение, которое я искал –

0

Я думаю, что вы просто хотите left join:

select t1.key, t1.value, t2.key, t2.value 
from table1 t1 left join 
    table2 t2 
    on t1.key = t2.key and t1.value = t2.value; 

Если вы хотите не-матчи в table1, а также, а затем использовать full outer join вместо left join.

+0

К сожалению, ключи в таблицах - это только упрощения, и они не связаны, я не могу использовать его по-своему. –

+0

@PetrEhler. , , Этот запрос довольно четко отвечает на вопрос, который вы задали. Если у вас есть другой вопрос, я бы предложил вам задать другой вопрос с соответствующими данными образца и желаемыми результатами. –

+0

Предположим, что в таблице 2 указаны значения a, b, c, d. Ключ в таблице2 не связан с ключом в таблице1. –

Смежные вопросы