Sql server 当连接依赖于第三个表中的数据时,如何在MSSQL中反连接
这是我的情况Sql server 当连接依赖于第三个表中的数据时,如何在MSSQL中反连接,sql-server,join,anti-join,Sql Server,Join,Anti Join,这是我的情况 PayTable +-------+------+--------------+ | Craft | Job | sequence | +-------+------+--------------+ | 400 | 1 | 1 | +-------+------+--------------+ | 401 | 2 | 2 | +-------+------+--------------+ | 5501 |
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中不存在的所有工艺品。作为一种反连接模式,这似乎非常简单,但我似乎无法让数据正确返回
连接链接包括:
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
这并没有返回我期望的数据,我期望PayTable的第3行只返回,而我得到的是第1、2行,我猜你在发布问题时移动了一些东西,基本上解决了它。从上面的查询中,您只需将
PayCraftTemplate.Template
更改为PayCraftTemplate.PayTemplate
起初,我认为这是一个问题,左连接
,其中无意中将其转换为内部连接
,但在这种情况下,内部连接
无论如何都是需要的,所以这不是问题所在
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 |
+-------+-----+----------+
为什么要在内部联接中链接PayTable,而不是在内部子选择中执行where子句?这是我将where子句移动到联接时留下的,因为它是一个
左联接。他们可以返回到where
子句。我刚刚编辑完我的答案,展示了你的答案是如何在拼写错误修复的情况下工作的。@JeremyKeczan是的!非常接近!