【问题标题】:SQL WHERE Subquery in Field List字段列表中的 SQL WHERE 子查询
【发布时间】:2015-06-02 12:11:16
【问题描述】:

我有这样的查询:

SELECT field
FROM table
WHERE
    (
        SELECT COUNT(*)
        FROM table2
        WHERE table2.field = table.field
    )
    !=
    (
        SELECT COUNT(*)
        FROM table3
        WHERE table3.field = table.field
    )

现在我想在我的字段列表中包含那些 WHERE 子查询,例如:

SELECT field, count1, count2
FROM table
WHERE
    (
        SELECT COUNT(*)
        FROM table2
        WHERE table2.field = table.field
    ) AS Count1
    !=
    (
        SELECT COUNT(*)
        FROM table3
        WHERE table3.field = table.field
    ) AS Count2

这可能吗?当然我可以把这些子查询放在字段列表中,但是我不能比较它们。

有什么想法吗?

【问题讨论】:

    标签: sql subquery fieldlist


    【解决方案1】:

    如果你使用Sql Server,你可以这样做:

    SELECT field, ca2.c2, ca3.c3
    FROM table t
    cross apply(SELECT COUNT(*) c2
                FROM table2 t2
                WHERE t2.field = t.field)ca2
    cross apply(SELECT COUNT(*) c3
                FROM table3 t3
                WHERE t3.field = t.field)ca3
    where ca2.c2 <> ca1.c1
    

    【讨论】:

      【解决方案2】:

      使用相关的子选择进行计数。总结在派生表中:

      select dt.* from
      (
      SELECT field,
             (SELECT COUNT(*)
              FROM table2
              WHERE table2.field = table.field) as cnt1,
             (SELECT COUNT(*)
              FROM table3
              WHERE table3.field = table.field) as cnt2
      FROM table
      ) dt
      where dt.cnt1 <> dt.cnt2
      

      【讨论】:

      • 我打算提出完全相同的建议,但我认为 giorgi 的答案可能会有更好的表现。
      • 取决于使用的 DBMS? (没有指定 dbms...)
      • @ZoharPeled:两个版本之间真的有区别吗?我会假设这是完全相同的计划(否则优化器很愚蠢)
      • 这更像是一种预感,真的。我没有测试它,但子查询因性能不佳而臭名昭著,所以......但话又说回来,这应该被测试(也许由 OP)注意我写了“可能有更好的性能”(还有东西而不是想想,但这只是废话......)
      • @ZoharPeled:如果您在 `SELECT` 或 CROSS APPLY 中执行关联子查询,它仍然是关联子查询 :-)
      【解决方案3】:

      您只需要使用派生表:

      select *
      from
       (
         SELECT field, 
          (
              SELECT COUNT(*)
              FROM table2
              WHERE table2.field = table.field
          ) AS Count1,
          (
              SELECT COUNT(*)
              FROM table3
              WHERE table3.field = table.field
          ) AS Count2
         FROM table
       ) dt
      WHERE Count1 <> Count2
      

      【讨论】:

      • 您在 AS Count1 后漏掉了一个逗号
      • @jarlh: 剪切和粘贴 :-)
      猜你喜欢
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2019-08-03
      • 2023-02-07
      • 2018-12-03
      • 2019-11-04
      • 2011-12-03
      相关资源
      最近更新 更多