【问题标题】:SQL code to find if a series of lists do NOT contain a particular value查找一系列列表是否不包含特定值的 SQL 代码
【发布时间】:2020-04-12 18:52:28
【问题描述】:

我有两张桌子

工作

+-----+------+
| Job | Name |
+-----+------+
|   1 | Foo  |
|   2 | Bar  |
|   3 | Baz  |
|   4 | Qwe  |
+-----+------+

Job_Operations

+-----+--------------+
| Job | Work_Center  |
+-----+--------------+
|   1 | SomeCenter   |
|   1 | Full Kit     |
|   2 | SomeCenter   |
|   3 | SomeCenter   |
|   3 | Full Kit     |
+-----+--------------+

这些表在Job 列上链接。我如何在Jobs 中找到条目没有 Job_Operations 中相应的“完整套件”条目?

期望的结果

+-----+------+
| Job | Name |
+-----+------+
|   2 | Bar  |
|   4 | Qwe  |
+-----+------+

【问题讨论】:

  • 我们真的不需要知道前 4 段的内容!我也不想从叙述文本中解析出表格结构。更有用的是JobsJob_Operations 的示例表格数据,包括一个带有完整套件的示例和一个没有完整套件的示例,以及一个简短的说明,您正在尝试找到没有“完整套件”的示例以及所需的结果
  • 请仅提供技术细节。目前这很难阅读!
  • 我已经为您重写了您的问题,以排除不相关的信息
  • 我很抱歉。这里是全新的。对马丁·史密斯来说……那次重写非常棒!!!!谢谢。

标签: sql missing-data


【解决方案1】:

这似乎是一个直截了当的NOT EXISTS 查询

SELECT J.*
FROM   Jobs J
WHERE  NOT EXISTS(SELECT *
                  FROM   Job_Operations JO
                  WHERE  JO.Job = J.Job
                         AND JO.Work_Center = 'Full Kit') 

【讨论】:

    【解决方案2】:
       Select * from
        (
        select Jobs.* , job_Operations.Work_Center as wc
        from Jobs
        left join Job_Operations on Jobs.Job=Job_Operations.Job and Job_Operations.Work_Center='Full Kit'
        ) as sub1 where wc is null
    

    在子选择中 left join 告诉 SQL 服务器为 Jobs 表中的每一行给我一行,即使它在 job_Operations 中没有找到相应的值。在 job_Operations 中,只有包含您的“完整套件”的行才会被视为连接。如果连接失败,SQLsefer 只会为 job_Operations 中的字段返回 null。外部选择只是获取那些行。

    另一种方法是使用 Exists,在另一个答案中查看它是如何工作的。但是,如果您想学习 SQL,请尝试了解左、右内连接和外/全连接的工作原理。

    【讨论】:

      【解决方案3】:

      下面代码中的简单解决方案。 还要记住,“工作”并不意味着“高性能”。 在您的特定数据库上检查 SQL-plan

      select j.* 
      from job j
      where j.job not in (select jo.job 
                          from Job_Operations jo 
                          where jo.Work_Center = 'Full Kit');
      

      【讨论】:

      • 欢迎来到 Stack Overflow。通过添加一些关于它们的工作原理和原因的解释,几乎总是可以改进仅代码的答案。
      • 谢谢@Midiparse!你当然是对的。完成!
      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      相关资源
      最近更新 更多