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

如何使用SQL Server显示一个表中不存在但另一个表中存在的记录?,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有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 --

我有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(1201140020012400)

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

预期输出

ItemID    StoreID
-----------------
111       1302
111       1500
我尝试了不同的方式,但它带来了所有的存储ID

条件

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'

如果要从
ItemDynamic
获取所有不在
Sales
中的StoreID,请点击这里:

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
使用联接:

SELECT t1.*
FROM ItemDynamic t1
LEFT JOIN Sales t2
    ON t1.ItemID  = t2.ItemID AND
       t1.StoreID = t2.StoreID
WHERE t2.ItemID IS NULL
您可以这样做:

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;
这是一个

更新:
如果
S.StoreID为NULL
这意味着此行中没有日期,则
Time
列中有一个
NULL

到目前为止您尝试了什么?@Sami通过使用子查询,我们可以轻松实现它。你真的想看吗。我给了这张小桌子。
试着不工作了
。。。什么不起作用?除了缺少联接条件外,您的查询看起来是正确的。@mohamedfaiz如果您将
S.StoreID设置为NULL
,这意味着
S.Time
也为
NULL
对不起,请看我的条件,不应该使用子查询。我认为您还需要在
ItemID
上联接。此外,这与问题中给出的查询没有什么不同。@TimBiegeleisen正在编写demo@Sami我看了你的演示。它显示正确。但当我尝试使用相同的代码时,另外我在过滤器中添加了时间。但它没有带来任何好处result@mohamedfaiz这是因为您添加了
,并且我认为您输入的日期中没有匹配项set@mohamedfaiz正如我之前所说的,您在设置的日期范围内没有匹配项