2014-01-14 2 views
1

Создание и заполнение таблиц РОС:Возврат первый идентификатор, соответствующий последовательности условий

CREATE TABLE #POCSTBL (SCode varchar(10)) 
INSERT INTO #POCSTBL (SCode) 
SElECT 'LC13' 
UNION ALL 
SELECT 'LC22' 
UNION ALL 
SELECT 'LC31' 

CREATE TABLE #POCLUTBL (ID int Identity (1,1), LC1 varchar(10), LC2 varchar(10), LC3 varchar(10)) 

INSERT INTO #POCLUTBL (LC1, LC2, LC3) 
SELECT 'LC11',NULL,'LC13' 
UNION ALL 
SELECT 'LC21','LC13',NULL 
UNION ALL 
SELECT '-','LC31','LC33' 

SELECT * FROM #POCSTBL 
SELECT * FROM #POCLUTBL 

Мой Initial Try:

SELECT S.SCode, LU.ID FROM #POCSTBL S LEFT JOIN #POCLUTBL LU 
ON S.SCode = LU.LC1 OR S.SCode = LU.LC2 OR S.SCode = LU.LC3 

падение #Tbls:

DROP TABLE #POCSTBL 
DROP TABLE #POCLUTBL 

Желаемая Выход:

SCode ID 
LC13 2 
LC22 NULL 
LC33 3 

Я хочу найти столбец SCode из #POCSTBL для # LC2, если он найден, возьмите этот идентификатор в качестве вывода, , если ID не найден, тогда LC1, если найден, примет этот ID как вывод, , если ID не найден, тогда LC3, если он найден, принять этот идентификатор в качестве выходного сигнала, , если ID не найден, то ID = NULL

Спасибо

+0

#POCSTBL = POC Источник Таблица #POCLUTBLE = POC Таблица поиска SCODE = SourceCode LC (1/2/3) = Lookup Колонка (1/2/3) ... о том, что было мне кстати, кто придумал с этими именами. : P – 007

+0

TIL: Мне нужно быть более простым и менее странным. Thx Aaron;) – 007

ответ

1

Как это:

SELECT 
    S.SCode, 
    COALESCE(L1.ID, L2.ID, L3.ID) As ID 
FROM  #POCSTBL S 
LEFT JOIN #POCLUTBL L1 ON S.SCode = L1.LC1 
LEFT JOIN #POCLUTBL L2 ON S.SCode = L2.LC2 
LEFT JOIN #POCLUTBL L3 ON S.SCode = L3.LC3 

Предполагая, что не являются потенциальными SCodes дублирующие в LC1 , LC2 или LC3. Если может быть, тогда вам понадобится более сложная версия этого.

+0

это похоже на темную магию ... COALESCE = получение первого ненулевого значения из параметров (L1.ID, L2.ID, L3.ID), какова логика множественного объединения LEFT и их объединение условия? Thx для этого удивительного sln (я просто не совсем понимаю это в этот момент в моей жизни). – 007

+0

Каждый LEFT JOIN расширяет набор столбцов базовой таблицы. L1 добавляет столбцы для всех строк '# POCLUTBL', которые соответствуют LC1 для SCode. L2 добавляет столбцы для строк, которые соответствуют LC2 и L3, добавляет столбцы для совпадений LC3. Теперь со всеми возможными значениями соответствия в качестве столбцов addl в той же строке COALESCE может сканировать через * столбцы * и найти первый, который не является NULL. – RBarryYoung

+0

Итак, если я правильно вас понял, вы создаете 3 экземпляра одного и того же tbl #POCLUTBL и получаете несколько находок. Выполнение COALESCE, чтобы получить первое ненулевое значение. Что я не делаю, так как ваш запрос пропускает SCode: LC13, ID: 1? – 007

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