我有下面列两个表
Id Name Price
1 Item1 1€
和表
Id Price
1 2€
我想只能选择一个为每个项目一行。如果加入存在,那么我需要从这个“InventoryPrices”别人从我的第一台“清单”中,选择价格。到现在为止,如果“InventoryPrices”与第一台“库存”加入它返回我的两行对每个ID。
如何检查是否加入不为空,然后给我一个排,二表价格
要检查是否在InventoryPrices
表中存在的记录,你需要使用LEFT JOIN
为了让只有一排每个ID,你可以使用ROW_NUMBER()
像下面的查询。
SELECT *
from
(
SELECT t1.id,
t1.NAME,
COALESCE(t2.price,t1.price) AS price ,
Row_number() OVER(partition BY t1.id ORDER BY t1.id) rn
FROM inventory t1
LEFT JOIN inventoryprices t2
ON t1.id=t2.id
) t
WHERE t.rn=1
您可以使用下面的查询:
WITH CTE_1 AS (
SELECT T1.ID, T1.Name,
CASE WHEN T2.Price is NOT NULL THEN T2.Price ELSE T1.Price END as [Price],
ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) as rn
FROM Inventory T1
LEFT JOIN InventoryPrices T2
ON T1.ID = T2.ID)
SELECT * FROM CTE_1 WHERE rn = 1
outer apply
- 它实现了一种叫做“横向连接” - 也就是你想要做什么:
select t1.id, t1.name, coalesce(t2.price, t1.price)
from t1 outer apply
(select top (1) t2.*
from t2
where t2.id = t1.id
) t2;
通常情况下,子查询将有一个order by
指定要哪个价格 - 最小的,最古老的,最新的,或通过其他方式优先。