如果连接存在则 return 来自连接 table 的值
If join exists then return value from join table
我有两个 table 列在下面
库存:
Id Name Price
1 Item1 1€
和Table
库存价格:
Id Price
1 2€
我想 select 每个项目只有一行。
如果加入存在,那么我需要从这个 'InventoryPrices' 中 select 定价,否则从我的第一个 table 'Inventory' 中定价。到现在为止,如果 'InventoryPrices' 加入第一个 table 'Inventory' 它 returns 我每个 ID 两行。
我如何检查 join 是否不为 null 然后显示第二行 table price
要检查 InventoryPrices
table 中是否存在记录,您需要使用 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
-- 它实现了一个叫做 "lateral join" 的东西 -- 做你想做的事:
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
来指定 哪个 您想要的价格 -- 最小的、最旧的、最新的或通过其他方法确定优先级的。
我有两个 table 列在下面
库存:
Id Name Price
1 Item1 1€
和Table
库存价格:
Id Price
1 2€
我想 select 每个项目只有一行。 如果加入存在,那么我需要从这个 'InventoryPrices' 中 select 定价,否则从我的第一个 table 'Inventory' 中定价。到现在为止,如果 'InventoryPrices' 加入第一个 table 'Inventory' 它 returns 我每个 ID 两行。
我如何检查 join 是否不为 null 然后显示第二行 table price
要检查 InventoryPrices
table 中是否存在记录,您需要使用 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
-- 它实现了一个叫做 "lateral join" 的东西 -- 做你想做的事:
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
来指定 哪个 您想要的价格 -- 最小的、最旧的、最新的或通过其他方法确定优先级的。