如果连接存在则 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 来指定 哪个 您想要的价格 -- 最小的、最旧的、最新的或通过其他方法确定优先级的。