如果存在联接,则从联接表返回值

时间:2019-02-10 09:11:21

标签: sql sql-server tsql sql-server-2008-r2

我有两个表,下面有列

库存:

Id   Name    Price
 1   Item1    1€

库存价格:

Id      Price
 1       2€

我只想为每个项目选择一行。 如果存在联接,那么我需要从此“ InventoryPrices”中选择价格,否则从我的第一个表“ Inventory”中选择价格。直到现在,如果“ InventoryPrices”与第一个表“ Inventory”联接,它将为我返回每个ID两行。

Same IDs

我该如何检查join是否不为null,然后用Second table price向我显示一行

3 个答案:

答案 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来指定您想要的价格 -最小,最旧,最新或通过其他方法确定优先级。