2017-01-30 6 views
1

Я пытаюсь написать запрос для последующего. Предположим, что таблица A и таблица B имеют следующие столбцы, как определено.Как вернуть соответствующее значение столбца в инструкции CASE в SQL Server

Таблица A (a, b, c, d, e, f, g, h) Таблица B (a, b, c, d, e, f, g, h, i, j, k) - Это имеет подмножество строк таблицы A.

declare @tableA table (a int, b int, c int, d int, e int, f int, g int, h int) 
insert into @tableA values 
(1,2,3,4,5,5,7,8), 
(1,2,3,4,5,6,7,8), 
(2,3,4,5,6,7,8,9), 
(2,3,4,5,6,7,8,8), 
(2,4,5,6,7,8,8,9), 
(3,4,5,6,7,8,9,9) 

declare @tableB table (a int, b int, c int, d int, e int, f int, g int, h int, i int, j int k int) 
insert into @tableB values 
(1,2,3,4,5,6,7,8,9,9,0), 
(2,3,4,5,6,7,8,8,1,9,0), 
(2,4,5,6,7,8,8,9,5,8,9), 
(3,4,5,6,7,8,9,9,7,8,9) 

Обратите внимание, что обе таблицы имеют одинаковые столбцы и имеют дублированные строки. Теперь я хочу запрос, который возвращает все строки в таблице A с дополнительным столбцом (скажем, «iI»), который был бы NULL, если эта строка не присутствует в таблице B else, она возвращает соответствующее значение столбца «i», соответствующее строке в таблица Б. Тогда запрос должен вернуть результат в следующем:

(1,2,3,4,5,5,7,8,NULL) 

(1,2,3,4,5,6,7,8,9) 

(2,3,4,5,6,7,8,9,NULL) 

(2,3,4,5,6,7,8,8,1) 

(2,4,5,6,7,8,8,9,5) 

(3,4,5,6,7,8,9,9,7) 

Можете ли вы помочь мне написать запрос. Я попытался соединить эти таблицы и использовал случай заявление, но он бросает мне ошибку, которая говорит сазе не может возвращать несколько значений

+0

'from TableA ПОЛНАЯ ВНУТРЕННЯЯ ПРИСОЕДИНЯЮЩАЯСЯ В таблице B b на a.a = b.a и a.b = b.b и a.c = b.c ... etc'? Трудно сказать, так как ваши результаты не отражают ваши наборы данных от того, что я могу получить. – scsimon

+0

«Обратите внимание, что обе таблицы имеют одинаковые столбцы [...]», нет, они этого не делают! «... и имеет дублированные строки ...» нет, они этого не делают! –

ответ

2

Я бы сказал, что левое внешнее соединение должно решить вашу проблему:

select a.*, b.i 
from TableA a left outer join TableB b on a.a = b.a and a.b = b.b ... 

Обратите внимание, что левое внешнее соединение будет содержать все кортежи от A, а дополнительные столбцы от B заполняются значениями, если существует соответствующий набор, или с NULL в противном случае.

0
declare @tableA table (a int, b int, c int, d int, e int, f int, g int, h int) 
insert into @tableA values 
(1,2,3,4,5,5,7,8), 
(1,2,3,4,5,6,7,8), 
(2,3,4,5,6,7,8,9), 
(2,3,4,5,6,7,8,8), 
(2,4,5,6,7,8,8,9), 
(3,4,5,6,7,8,9,9) 

declare @tableB table (a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int) 
insert into @tableB values 
(1,2,3,4,5,6,7,8,9,9,0), 
(2,3,4,5,6,7,8,8,1,9,0), 
(2,4,5,6,7,8,8,9,5,8,9), 
(3,4,5,6,7,8,9,9,7,8,9) 

select 
    a.*, 
    b.i, 
    b.j, 
    b.k 
from 
    @tableA a 
left outer join 
    @tableB b on a.a = b.a and a.b = b.b and a.c = b.c and a.d = b.d and a.e = b.e and a.f = b.f and a.g = b.g and a.h = b.h