如果加入存在,那么从连接表返回值

问题描述 投票:3回答:3

我有下面列两个表

Inventory:

Id   Name    Price
 1   Item1    1€

和表

InventoryPrices:

Id      Price
 1       2€

我想只能选择一个为每个项目一行。如果加入存在,那么我需要从这个“InventoryPrices”别人从我的第一台“清单”中,选择价格。到现在为止,如果“InventoryPrices”与第一台“库存”加入它返回我的两行对每个ID。

Same IDs

如何检查是否加入不为空,然后给我一个排,二表价格

sql sql-server tsql sql-server-2008-r2
3个回答
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

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

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指定要哪个价格 - 最小的,最古老的,最新的,或通过其他方式优先。

© www.soinside.com 2019 - 2024. All rights reserved.