【问题标题】:Minus operator in sqlsql中的减号运算符
【发布时间】:2017-11-03 15:51:12
【问题描述】:

我正在尝试用减号创建一个 sql 查询。

我有 query1,它返回 28 行,2 列 我有 query2,它返回 22 row2,在查询 2 中有相同的 2 列。

当我创建查询 query1 减去查询 2 时,它应该只显示 28-22=6 行。 但它显示了 query1 返回的所有 28 行。

请指教。

【问题讨论】:

  • 您的目标是哪个数据库?我个人只在 oracle 上使用过minus。例如,我知道它在 Sql Server 上并不严格存在于这种形式中。
  • 发布您的查询和减号两边的一些示例数据?
  • (假设 oracle)要使minus 工作,整行必须完全匹配。
  • 好吧,query2 返回的元组显然都没有在query1 中显示为行。
  • -1 表示从不回答有关这是什么 rdbms 的问题。

标签: sql


【解决方案1】:

尝试使用 EXCEPT 而不是 MINUS。例如: 让我们考虑一种情况,您想找出表中尚未分配给您的任务(因此基本上您正在尝试查找可以执行的任务)。

SELECT TaskID, TaskType
FROM Tasks
EXCEPT
SELECT TaskID, TaskType
FROM Tasks
WHERE Username = 'Vidya'

这将返回所有尚未分配给您的任务。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    如果 MINUS 对您不起作用,您想要的一般形式是外部选择中的主查询和 not exists 子句中的其他查询的变体。

    select <insert list of fields here>
    from mytable a
    join myothertable b 
    on b.aId = a.aid
    where not exists (select * from tablec c where a.aid = c.aid) 
    

    【讨论】:

      【解决方案3】:

      字段可能不完全相同。可能其中一个字段是 char(10),另一个是 char(20),它们都包含字符串“TEST”。它们可能“看起来”一样。

      如果您正在处理的数据库支持“INTERSECT”,请尝试此查询,看看有多少是完全匹配的结果。

      select field1, field2 from table1
      intersect 
      select field1, field2 from table2
      

      要获得您期望的结果,此查询应为您提供 22 行。

      【讨论】:

      • OP 正在寻找 6 行,而不是 22 行(假设 26 是错字)。
      • 如果查询 1 和查询 2 共有 22 行,则 MINUS 查询将给出两行不共有的 6 行。我的回答是确认数据符合 OP 的预期。
      • 这不是 OP 要求的。这没有回答问题。
      • 其他答案已经给出了实际查询。我试图解释他如何找出问题(为什么查询没有像他预期的那样工作)。
      【解决方案4】:

      类似这样的:

      select field1, field2, . field_n
       from tables
       MINUS
       select field1, field2, . field_n
       from tables;
      

      【讨论】:

        【解决方案5】:

        MINUS 的工作原理与它在集合操作中的工作原理相同。假设如果你设置了 A 和 B, A = {1,2,3,4}; B = {3,5,6} 那么,A-B = {1,2,4}

        如果 A = {1,3,5} 且 B = {2,4,6} 那么,A-B = {1,3,5}。这里 MINUS 操作前后的 count(A) 是相同的,因为它不包含与集合 B 的任何重叠项。

        在类似的行上,可能是在查询 2 中获得的结果集可能与查询 1 的结果没有匹配项。因此,您仍然得到 28 行而不是 6 行。

        希望这会有所帮助。

        【讨论】:

          【解决方案6】:

          返回上层查询中第二个查询不包含的差异记录。

          以你为例 A={1,2,3,4,5...28} AND B={29,30} 然后 A-B={1,2,3....28}

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-03
            • 2011-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多