2015-04-24 2 views
2

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

У меня есть две одинаковые таблицы. Скажем, у каждого из них есть только 2 столбца: PartNumber и Order.

В одном операторе, я хочу, чтобы выбрать номера изделий из WorkItemPartsFiltered где Order = ABC, но если их нет, я хочу, чтобы выбрать их из WorkItemParts где Order = ABC

--WorkItemParts 
PartNumber | Order 
123  | ABC 
456  | ABC 
789  | ABC 
012  | ABC 
123  | DEF 
456  | DEF 
389  | GHI 


--WorkItemPartsFiltered 
PartNumber | Order 
123  | ABC 
456  | ABC 
789  | ABC 
456  | DEF 
389  | GHI 

ответ

1

Вы должны использовать случай Заявление с JOIN, как это:

SELECT Order, CASE WHEN WorkItemParts.PartNumber is null 
    THEN WorkItemPartsFiltered.PartNumber 
    ELSE WorkItemParts.PartNumber END 
FROM WorkItemParts 
LEFT JOIN WorkItemPartsFiltered 
     ON (WorkItemPartsFiltered.Order = WorkItemParts.Order) 
2
SELECT [Order] 
     , COALESCE(WorkItemParts.PartNumber 
         ,WorkItemPartsFiltered.PartNumber) AS PartNumber 
FROM WorkItemParts 
LEFT JOIN WorkItemPartsFiltered 
ON WorkItemPartsFiltered.[Order] = WorkItemParts.[Order] 
2

Вы можете использовать сливаются, в сочетании с LEFT JOIN:

select 
coalesce (WIPF.PartNumber, WIP.PartNumber) 
from 
WorkItemParts WIP 
left join WOrkItemPartsFiltered WIPF 
    on wip.order = wipf.order 
1

Вы также можете написать как:

if not exists (
select * 
from WorkItemPartsFiltered 
where [Order] = 'KLM') 
begin 
    select PartNumber,[Order] 
    from WorkItemParts 
    where [Order] = 'KLM' 
end 
else 
begin 
    select PartNumber,[Order] 
    from WorkItemPartsFiltered 
    where [Order] = 'KLM'  
end 

DEMO

1

Еще один способ сделать это:

Create Table dbo.partsfiltered 
(
PartNumber int, 
OrderNum varchar(5), 
SourceTable varchar(20) 

); 
Insert into partsfiltered 
Values (123,'abc','filtered'), (678,'ghi','filtered'); 

Create Table dbo.parts 
(
PartNumber int, 
OrderNum varchar(5), 
SourceTable varchar(20) 
); 
Insert into parts 
Values (123,'abc','full'), (345,'def','full'), (678,'ghi','full'); 


with cte as 
(
     Select PartNumber, 
       OrderNum, 
       SourceTable, 
       ROW_NUMBER() Over (Partition By PartNumber order by SourceTable) as [SourceTableRank] 
     From 
     (
     select * From partsfiltered 
     union 
     select * From parts 
     )a 

) 
Select PartNumber, OrderNum, SourceTable 
From cte 
where SourceTableRank = 1; 

SQLFiddle here

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