组合(连接)没有键的表

def*_*ork 1 t-sql

我有表 B 和表 A。表 B 包含我需要提取的日期记录。但是,我只想在以下情况下拉动它们:

  • 它们在表 A 中根本不存在
  • 它们存在于表 A 中,但仅当表 A.status = 0 时

诀窍是我没有钥匙可以加入表格。所以,我使用 Item 列和 date 列来加入。(注意两个项目可以有相同的日期。也可以有多个相同的项目,但日期也不同。)

所以表 B 可能有:

    [Item]      [Qty]   [Date]
    F-001100,   400      7/14/2016
    F-002200,   750      7/28/2016
    F-000767,   1000     7/28/2016
    F-006006,   300      8/01/2016
    F-002200,   900      7/30/2016
Run Code Online (Sandbox Code Playgroud)

表A可能有:

[Item]    [Status]  [Qty]    [Date0]     [Date2]     [Date3]     [Date4]
F-001100, 1,        400      7/14/2016   7/15/2016   7/16/2016   7/17/2016
F-002200, 0,        750      7/28/2016   7/29/2016   7/30/2016   7/31/2016
Run Code Online (Sandbox Code Playgroud)

所以结果集应该是:

[Item]       [Qty]     [Date]
F-002200,    750       7/28/2016
F-000767,    1000      7/28/2016
F-006006,    300       8/01/2016
F-002200,    900       7/30/2016   <--- I can't get this to show up!!
Run Code Online (Sandbox Code Playgroud)

匹配是这样的:

WHERE A.[Item] = B.[Item]
AND (   A.[Date1] = B.[Date]
     OR A.[Date2] = B.[Date]
     OR A.[Date3] = B.[Date]
     OR A.[Date4] = B.[Date] )
Run Code Online (Sandbox Code Playgroud)

And*_*y M 10

看起来您的两个条件可以简化为一个:

  • 它们在状态为 1 的表 A 中不存在。

基于此,您的 SQL 查询可能如下所示:

SELECT
  B.*
FROM
  B
WHERE
  NOT EXISTS
  (
    SELECT
      *
    FROM
      A
    WHERE
      A.Status = 1
      AND B.Item = A.Item
      AND B.Date IN (A.Date1, A.Date2, A.Date3, A.Date4)
  )
;
Run Code Online (Sandbox Code Playgroud)

因此,如果表 A 在ItemDate上根本没有匹配,则 NOT EXISTS 谓词将评估为True。如果存在匹配且其状态为 0,则由于状态条件,谓词将再次为真。