【问题标题】:How can I combine three select queries, each excluding the results from the previous ones?如何组合三个选择查询,每个查询都不包括前一个查询的结果?
【发布时间】:2012-07-06 14:10:06
【问题描述】:

假设我有三个不同的选择语句,像这样

SELECT 'Final', ID FROM Stage WHERE stageCompleted = 1;
SELECT 'Active', ID FROM Stage WHERE StartDate < NOW();
SELECT 'Inactive', ID FROM Stage;

我想要的是某种组合这些的方法,以便显示一个表格

  • 返回字符串 'Final' 和第一个查询匹配的所有行的行 ID
  • 返回字符串 'Active' 和第二个查询匹配但第一个查询不匹配的所有行的行 ID
  • 并返回字符串'Inactive' 和所有剩余行的ID。

我查看了各种联接,但它们似乎并不真正适合我要解决的问题。如何在 SQL 中组合三个选择查询,其中每个查询都排除了前一个查询的结果?

【问题讨论】:

  • 换个角度思考问题。您希望返回 Stage 表中的每一行,但每一行将只有一个“状态”。您可以通过 UNIONing 三个不同的结果集获得相同的结果集,并使用反连接模式来限制每个返回的行,但这不是必需的(在您的情况下),并且这样的查询几乎不会那么有效作为对 Stage 表的单次扫描。

标签: mysql sql


【解决方案1】:

使用案例陈述

SELECT
   CASE WHEN stageCompleted = 1 THEN 'Final'
        WHEN StartDate < NOW() THEN 'Active'
        ELSE 'Inactive'
   END,
   ID
FROM Stage

【讨论】:

  • +1 这是最干净、最有效的方法,一次扫描整个表。还有其他方法可以返回结果集,但它们的性能可能不会像现在这样好。 (更准确地说,它实际上是在 SQL 语句中使用的 CASE“表达式”。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2014-11-25
  • 2019-04-05
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多