如果另一个中不存在数据,如何从 table SELECT
How to SELECT from a table if no data exists in another
这应该很简单。我不知道为什么我感到难过。
我有两个相似的表。假设它们每个都只有 2 列:PartNumber 和 Order。
在一条语句中,我想 select 来自 WorkItemPartsFiltered 的 PartNumbers,其中 Order = ABC,但如果 none 存在,我想 select 来自 WorkItemParts 的它们,其中 Order =美国广播公司
--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
您必须像这样使用带有 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)
SELECT [Order]
, COALESCE( WorkItemParts.PartNumber
,WorkItemPartsFiltered.PartNumber) AS PartNumber
FROM WorkItemParts
LEFT JOIN WorkItemPartsFiltered
ON WorkItemPartsFiltered.[Order] = WorkItemParts.[Order]
您可以结合左连接使用合并:
select
coalesce (WIPF.PartNumber, WIP.PartNumber)
from
WorkItemParts WIP
left join WOrkItemPartsFiltered WIPF
on wip.order = wipf.order
你也可以这样写:
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
另一种方法:
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;
这应该很简单。我不知道为什么我感到难过。
我有两个相似的表。假设它们每个都只有 2 列:PartNumber 和 Order。
在一条语句中,我想 select 来自 WorkItemPartsFiltered 的 PartNumbers,其中 Order = ABC,但如果 none 存在,我想 select 来自 WorkItemParts 的它们,其中 Order =美国广播公司
--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
您必须像这样使用带有 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)
SELECT [Order]
, COALESCE( WorkItemParts.PartNumber
,WorkItemPartsFiltered.PartNumber) AS PartNumber
FROM WorkItemParts
LEFT JOIN WorkItemPartsFiltered
ON WorkItemPartsFiltered.[Order] = WorkItemParts.[Order]
您可以结合左连接使用合并:
select
coalesce (WIPF.PartNumber, WIP.PartNumber)
from
WorkItemParts WIP
left join WOrkItemPartsFiltered WIPF
on wip.order = wipf.order
你也可以这样写:
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
另一种方法:
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;