如何使用 NOT IN CLAUSE 连接三个表

How to join three tables with a NOT IN CLAUSE

场景...商店获得列表。 'LIST'基本上就是需要统计的店铺库存的SKU集合。

当商店开始计算分配给它的给定列表中的 SKU 时,信息将保存在另一个名为 'StoreCycles' 的 table 中,它记录了 ListId、StoreName 和计数开始的日期以及完成。

这些是我的 table。

Table 1. Table 和 'Lists' 有一个主键 'ListId'

ListId ListName  
   1       abc
   2       def
   3       ghi

Table 2. 'Stores' -- 上面的每个列表 table ('Lists' Table) 被分配给一个或多个商店。 'Stores' Table 中的ListId 是'Lists' 表的主键。 Listid和LineId一起组成外键

ListId LineId StoreName
  1       1    StoreA
  1       2    StoreD
  2       1    StoreB
  2       2    StoreC
  2       3    StoreA
  3       1    StoreA

Table 3. 'StoreCycles' -- 保存分配给商店的列表何时开始计数以及何时完成。

ListId  StoreName  StartDate   CompleteDate
  1      StoreA   2016-7-22    2016-7-22
  2      StoreA   2016-7-22
  2      StoreC   2016-7-22

任何时候我都想调出那些尚未完成的列表名称,即它们的完整日期为空。

这是我的查询:

Select  T0.ListId,
T0.ListNaame  ,
T2.StartDate   
From    Lists T0
JOIN    Stores T1   On  T0.ListId  = T1.ListId 
LEFT JOIN StoreCycles T2   ON  T0.ListId  = T2.ListId
WHERE T1.StoreName = 'StoreA'
AND T0.ListId  NOT IN (SELECT ListId FROM StoreCycles WHERE CompleteDate IS NOT NULL)   

结果应该是 >>

ListId ListName StartDate
  2      def      2016-7-22
  3      ghi      NULL

但是我得到的结果是这样的

ListId ListName StartDate
 2      def        NULL
 2      def        NULL
 3      ghi        NULL

也许另一种看待它的方法是 return 所有 StartDate 为 NULL(无记录)或 CompleteDate 为 NULL(不完整记录)的行。此外,如果外键使用 2 列,您可能希望在 JOIN 中同时使用这两列。

SELECT  T0.ListId,
        T0.ListName,
        T2.StartDate
FROM    Lists T0
            JOIN Stores T1   
                 ON T1.ListId = T0.ListId
            LEFT JOIN StoreCycles T2
                 ON T2.ListId = T1.ListId
                AND T2.LineId = T1.LineId
WHERE T1.StoreName = 'StoreA'
AND (T2.CompleteDate IS NULL OR T2.StartDate IS NULL)
Select 
    l.ListId
    ,l.ListNaame 
    ,sc.StartDate
From
    Lists l
    JOIN Stores s
    ON  l.ListId  = s.ListId
    AND s.StoreName = 'StoreA' 
        LEFT JOIN StoreCycles sc 
        ON  s.ListId  = sc.ListId
        AND s.LineId = sc.LineId
WHERE
      sc.CompleteDate IS NULL

如果您正确构建它们,您已经在进行连接,您将不需要 select 或不在您的 where 子句中。另外,您与 StoreCycles 的关系似乎是错误的,因为您试图直接从 ListsStoreCycles,但 Stores 是中介 table.

还有一个想法,为什么不使用 table 别名来帮助您了解 table 您指的是什么,而不是 t0、t1、t2,例如 l、s、sc... .

路过转转SQL。

继续,没什么可看的。

这里没有进行错误搜索。

declare @Lists table (ListId int primary key, ListName varchar(20));
insert into @lists values (1,'abc'),(2,'def'),(3,'ghi');

declare @Stores table (ListId int, LineId int, StoreName varchar(20));
insert into @Stores values 
(1,1,'StoreA'),
(1,2,'StoreD'),
(2,1,'StoreB'),
(2,2,'StoreC'),
(2,3,'StoreA'),
(3,1,'StoreA');

declare @StoreCycles table (ListId int, StoreName varchar(20), StartDate date, CompleteDate date);
insert into @StoreCycles values
(1,'StoreA','2016-7-22','2016-7-22'),
(2,'StoreA','2016-7-22',null),
(2,'StoreC','2016-7-22',null);

SELECT
L.ListId,
L.ListName,
SC.StartDate
FROM @Stores S   
JOIN @Lists L On (S.ListId  = L.ListId)
LEFT JOIN @StoreCycles SC ON (S.ListId  = SC.ListId AND S.StoreName = SC.StoreName)
WHERE S.StoreName = 'StoreA' 
AND SC.CompleteDate IS NULL;