当连接依赖于第三个 table 的数据时如何在 MSSQL 中反连接

How to Anti Join in MSSQL when the join depends on data from a 3rd table

这是我的情况。

PayTable
+-------+------+--------------+
| Craft | Job  | sequence     |
+-------+------+--------------+
| 400   | 1    | 1            |
+-------+------+--------------+
| 401   | 2    | 2            |
+-------+------+--------------+
| 5501  | 2    | 3            |
+-------+------+--------------+

Jobs
+-------+------+------+
| Job | CraftTemplate |
+-------+------+------+
| 1   | 1             |
+-------+------+------+
| 2   | 1             |
+-------+------+------+


Pay Template
+-------+--+
| Template |
+-------+--+
| 1        |
+-------+--+

PayCraftTemplate
+-------+------+---------+
| PayTemplate    | Craft |
+-------+------+---------+
| 1              | 400   |
+-------+------+---------+
| 1              | 401   |
+-------+------+---------+

我需要做的是从 PayTable 中找到 PayCraftTemplate 中不存在的所有工艺。作为反连接模式,这似乎非常简单,但我似乎无法将数据适当地返回 return。

加入链接是:

PayTable INNER JOIN Jobs by Job -> Job
Jobs LEFT OUTER JOIN Pay Template by CraftTemplate -> Template
Pay Template LEFT OUTER JOIN by Template -> PayTemplate 

这是我目前的尝试:

select
    *
FROM
    PayTable
WHERE NOT EXISTS (
    SELECT 1
        FROM
    Jobs 
        LEFT OUTER JOIN PayTemplate
        ON PayTemplate.Template = Jobs.CraftTemplate
    LEFT OUTER JOIN PayCraftTemplate 
        ON PayCraftTemplate.Template = PayTemplate.Template
    WHERE 
        PayTable.Craft = PayCraftTemplate.Craft AND PayTable.Job = Jobs.Job
) AND PayTable.Job IS NOT NULL AND PayTable.Craft IS NOT NULL

这不是 return 我期望的数据,我希望 PayTable 的第 3 行只有 return 而我得到的是第 1,2

我猜您对 post 问题进行了一些改动并基本上解决了问题。从上面的查询中,您只需将 PayCraftTemplate.Template 更改为 PayCraftTemplate.PayTemplate

起初我认为这是 left join 的问题,where 无意中将其变成了 inner join,但在这种情况下 inner join 是需要的无论如何,所以这不是问题。

select    *
from  PayTable
where not exists (
  select 1
  from Jobs 
    inner join PayTemplate
      on PayTemplate.Template = Jobs.CraftTemplate
      and Jobs.Job = PayTable.Job
    inner join PayCraftTemplate 
      on PayCraftTemplate.PayTemplate = PayTemplate.Template
     and PayCraftTemplate.Craft  = PayTable.Craft 
  )
  and PayTable.Job is not null
  and PayTable.Craft is not null

结果:

+-------+-----+----------+
| Craft | Job | sequence |
+-------+-----+----------+
|  5501 |   2 |        3 |
+-------+-----+----------+