我有两个表,下面有列
Id Name Price
1 Item1 1€
表
Id Price
1 2€
我只想为每个项目选择一行。 如果存在联接,那么我需要从此“ InventoryPrices”中选择价格,否则从我的第一个表“ Inventory”中选择价格。直到现在,如果“ InventoryPrices”与第一个表“ Inventory”联接,它将为我返回每个ID两行。
我该如何检查join是否不为null,然后用Second table price向我显示一行
答案 0 :(得分:3)
要检查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
答案 1 :(得分:2)
您可以使用以下查询:
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
答案 2 :(得分:0)
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
来指定您想要的价格 -最小,最旧,最新或通过其他方法确定优先级。