sql - 如何将 2 个 select 语句合并为一个?

标签 sql select conditional-statements

对于 SQL 语法,我是个菜鸟。

当然,我有一个包含很多行和列的表格:P 可以说它看起来像这样:

      AAA BBB CCC DDD
-----------------------
Row1 | 1   A   D   X
Row2 | 2   B   C   X
Row3 | 3   C   D   Z

现在我想创建一个高级的 select 语句来给我这个组合(这里是伪 SQLish):

select 'Test1', * from TABLE Where CCC='D' AND DDD='X'
select 'Test2', * from TABLE Where CCC<>'D' AND DDD='X'

输出将是:

Test1, 1, A, D, X
Test2, 2, B, C, X

我如何将这两个选择语句组合成一个漂亮的选择语句?

如果我像下面这样复杂化 SQL(因为我自己的 SQL 语句包含存在语句),它会起作用吗?我只是想知道如何组合这些选择,然后尝试将其应用到我更高级的 SQL 中。

select 'Test1', * from TABLE Where CCC='D' AND DDD='X' AND exists(select ...)
select 'Test2', * from TABLE Where CCC<>'D' AND DDD='X' AND exists(select ...)




我的真实 SQL 语句是这样的:

select Status, * from WorkItems t1
where  exists (select 1 from workitems t2 where t1.TextField01=t2.TextField01 AND (BoolField05=1) )
AND TimeStamp=(select max(t2.TimeStamp) from workitems t2 where t2.TextField01=t1.TextField01) 
AND TimeStamp>'2009-02-12 18:00:00'

这给了我一个结果。但我想将它与此 select 语句的副本结合起来,并在末尾添加 AND,并且“Status”字段将使用“DELETED”等字符串进行更改。

select 'DELETED', * from WorkItems t1
where  exists (select 1 from workitems t2 where t1.TextField01=t2.TextField01 AND (BoolField05=1) )
AND TimeStamp=(select max(t2.TimeStamp) from workitems t2 where t2.TextField01=t1.TextField01) 
AND TimeStamp>'2009-02-12 18:00:00'
AND NOT (BoolField05=1)

最佳答案

这里你有两个选择。第一种是有两个结果集,它们将根据 WHERE 子句中的条件设置“Test1”或“Test2”,然后将它们UNION组合在一起:

select 
    'Test1', * 
from 
    TABLE 
Where 
    CCC='D' AND DDD='X' AND exists(select ...)
UNION
select 
    'Test2', * 
from 
    TABLE
Where
    CCC<>'D' AND DDD='X' AND exists(select ...)

这可能是一个问题,因为您将在 TABLE 上有效地扫描/查找两次。

另一种解决方案是从表中选择一次,然后根据表中的条件设置“Test1”或“Test2”:

select 
    case 
        when CCC='D' AND DDD='X' AND exists(select ...) then 'Test1'
        when CCC<>'D' AND DDD='X' AND exists(select ...) then 'Test2'
    end,
    * 
from 
    TABLE 
Where 
    (CCC='D' AND DDD='X' AND exists(select ...)) or
    (CCC<>'D' AND DDD='X' AND exists(select ...))

这里的问题是您必须在 CASE 语句和 WHERE 语句中复制过滤条件。

关于sql - 如何将 2 个 select 语句合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/542705/

相关文章:

SQL 查询 JOIN 一个表(单独的 ID 和 Titles 表)

conditional-statements - Svelte 的 v-show 替代品

PHP:is_array 在不应该返回 false 时返回 false

php - 如何从sql中的四个表中进行选择?

MYSQL 从每个类别中选择 2 个随机行

mysql - substring_index 不采用精确的前缀

javascript - Javascript 是否有像 Ruby 的 ||= (双管道)那样的条件赋值

java - 包含新闻文章的文本区域 - SQL 插入(开始新行)

sql - 是否有 SQL 语句允许我复制和插入现有行但更改一列?

mysql - 先按字母排序再按数字排序