【问题标题】:SQL clause to find certain pairs in a select [closed]SQL子句在选择中查找某些对[关闭]
【发布时间】:2017-05-31 19:30:15
【问题描述】:

所以我已经运行了一个 SELECT 到目前为止给了我这个结果:

这两列来自我连接在一起的不同表。两者都存储为数字。在这种情况下,“ID”是主要实体,ID_1 描述了“ID”可以处于的状态。一个主要实体可以同时具有多个状态,多个实体可以同时处于同一状态。

现在,我的选择显示了我的数据库中的所有实体状态对。我对最终结果的目标是显示没有至少一个条目且状态设置为 1 或 9 的任何实体的行。在上面的示例中,我希望最终结果显示具有以下 ID 的行: 62 和 82

知道如何存档吗?

提前致谢!

【问题讨论】:

  • 请将数据以格式化文本的形式发布,not screenshots。此外,如果不知道您的表结构,就很难回答。
  • 请编辑您的问题并包含产生上述结果的查询。谢谢。
  • GROUP BY table1.id HAVING COUNT( CASE WHEN table2.id IN (1,9) THEN 1 END ) = 0

标签: sql oracle select conditional


【解决方案1】:

您可以使用外部连接来完成此操作,方法类似于

SELECT DISTINCT t1.ID
  FROM TABLE_1 ti
  LEFT OUTER JOIN (SELECT t2.ID
                     FROM TABLE_2 t2
                     WHERE t2.ID_1 IN (1, 9))
  WHERE t2.ID IS NULL;

【讨论】:

  • +1。在我的回答中,我认为这样的事情是第二个选项,但鉴于 OP 似乎对 Oracle 不稳定,我害怕过载。我很高兴你添加了这个替代方案;它几乎总是比NOT IN 版本快。
【解决方案2】:

这将从ID_1 为 1 或 9 的第二个表中获取 ID:

SELECT ID
FROM second_table
WHERE ID_1 IN (1, 9)

使用它,您可以从 ID 不在上述结果集中的第一个表中进行选择:

SELECT DISTINCT ID
  FROM first_table
  WHERE ID NOT IN (
    SELECT ID
    FROM second_table
    WHERE ID_1 IN (1, 9)
  );

如果您有这样的场景,例如,ID 63 在第二个表中有三个记录,ID_1 的值分别为 3、4 和 6,SELECT DISTINCT 将确保 ID 63 仅在结果中显示一次三倍。

附录

另请参阅 Bob Jarvis 的回答。查询涉及更多,但返回相同的结果。更重要的是,它会在更大的数据集上运行得更快。

【讨论】:

    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 2014-04-14
    • 2011-05-24
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多