如何显示一个表中不存在但使用SQL Server出现在另一个表中的记录?

时间:2017-08-05 07:34:51

标签: sql sql-server stored-procedures

sample output我有3个名为Item,Sales,ItemDynamic的表

物品

ID
---
111
112

销售

ItemID    StoreID
------------------
111       1201
111       2001
111       2400      
111       1400
111       1201
111       1201
111       2400
111       2001

ItemDynamic

ItemID     StoreID
------------------
111       1201
111       1302
111       1400
111       2001
111       2400
111       1500
  

当您使用ItemID对Sales.StoreID进行分组时,它只有4个storeID(1201,1400,2001,2400)

     

现在我想只显示ItemDynamic.StoreID中的剩余商店,如下所示

期待输出

ItemID    StoreID
-----------------
111       1302
111       1500

我尝试了不同的方式,但它带来了所有的商店

条件

1.不应使用子查询

尝试不起作用

SELECT 
    IC.ItemID , IC.StoreID 
FROM 
    ItemDynamic IC
LEFT JOIN 
    Sales S ON S.StoreID = Ic.StoreID
WHERE 
    S.StoreID IS NULL and S.Time between '2017-07-16' and '2017-07-31'

3 个答案:

答案 0 :(得分:1)

你可以这样做:

Declare @Item Table (ID INT);
Declare @Sales Table (ItemID INT , StoreID INT);
Declare @ItemDynamic Table (ItemID INT , StoreID INT);

Insert into @Item values
(111),
(112);

Insert into @Sales values
(111,1201),
(111,2001),
(111,2400),
(111,1400),
(111,1201),
(111,1201),
(111,2400),
(111,2001);

Insert into @ItemDynamic values
(111,1201),
(111,1302),
(111,1400),
(111,2001),
(111,2400),
(111,1500);

SELECT IC.ItemID , IC.StoreID FROM @ItemDynamic IC
LEFT JOIN @Sales S ON S.StoreID = Ic.StoreID
WHERE S.StoreID IS NULL;

这是Demo

<强>更新 如果S.StoreID IS NULL表示此行中没有日期,则NULL列中会有Time

答案 1 :(得分:0)

如果您希望从[{1}}获取ItemDynamic的所有StoreID,请访问Sales

SELECT distinct StoreID FROM ItemDynamic 
WHERE StoreID not in (SELECT StoreID FROM Sales)

或没有子查询:

SELECT distinct ItemDynamic.StoreID FROM ItemDynamic 
LEFT JOIN Sales ON Sales.StoreID = ItemDynamic.StoreID
WHERE Sales.StoreID IS NULL

答案 2 :(得分:0)

使用联接:

SELECT t1.*
FROM ItemDynamic t1
LEFT JOIN Sales t2
    ON t1.ItemID  = t2.ItemID AND
       t1.StoreID = t2.StoreID
WHERE t2.ItemID IS NULL