如何使用 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
的关系似乎是错误的,因为您试图直接从 Lists
到 StoreCycles
,但 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;
场景...商店获得列表。 '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
的关系似乎是错误的,因为您试图直接从 Lists
到 StoreCycles
,但 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;