首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当连接依赖于来自第三个表的数据时,如何在MSSQL中反连接

当连接依赖于来自第三个表的数据时,如何在MSSQL中反连接
EN

Stack Overflow用户
提问于 2017-02-17 21:52:29
回答 1查看 3.3K关注 0票数 3

这是我的情况。

代码语言:javascript
运行
复制
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中不存在的所有工艺品。作为一种反联接模式,这看起来非常简单,但是我似乎不能正确地返回数据。

加入链接为:

代码语言:javascript
运行
复制
PayTable INNER JOIN Jobs by Job -> Job
Jobs LEFT OUTER JOIN Pay Template by CraftTemplate -> Template
Pay Template LEFT OUTER JOIN by Template -> PayTemplate 

这是我目前的尝试:

代码语言:javascript
运行
复制
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行

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-17 22:00:58

我猜你移动了一些东西来发布这个问题,并基本上解决了它。在上面的查询中,您只需要将PayCraftTemplate.Template更改为PayCraftTemplate.PayTemplate

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

代码语言:javascript
运行
复制
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

结果:

代码语言:javascript
运行
复制
+-------+-----+----------+
| Craft | Job | sequence |
+-------+-----+----------+
|  5501 |   2 |        3 |
+-------+-----+----------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42299667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档