[英]How to SELECT from a table if no data exists in another
This should be simple. 这应该很简单。 I don't know why I feel stumped.
我不知道为什么我感到难过。
I have two similar tables. 我有两张相似的桌子。 Let's say they each have just 2 columns: PartNumber, and Order.
假设它们每个只有2列:PartNumber和Order。
In a single statement, I want to select the PartNumbers from WorkItemPartsFiltered where Order = ABC, but if none exist, I want to select them from WorkItemParts where Order = ABC 在单个语句中,我想从WorkItemPartsFiltered中选择PartNumbers,其中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
SELECT [Order]
, COALESCE( WorkItemParts.PartNumber
,WorkItemPartsFiltered.PartNumber) AS PartNumber
FROM WorkItemParts
LEFT JOIN WorkItemPartsFiltered
ON WorkItemPartsFiltered.[Order] = WorkItemParts.[Order]
You can use coalesce, combined with a left join: 您可以使用coalesce,结合左连接:
select
coalesce (WIPF.PartNumber, WIP.PartNumber)
from
WorkItemParts WIP
left join WOrkItemPartsFiltered WIPF
on wip.order = wipf.order
You must use a case Statement with a JOIN like this: 您必须使用带有JOIN的case语句,如下所示:
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)
Yet another way to do this: 还有另一种方法:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.