这是我现有SQL查询的结构:
SELECT * FROM (
SELECT *, 'A' AS Status FROM Table1
WHERE Field1 NOT IN
(
SELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...
)
UNION
SELECT *, 'B' AS Status FROM Table1
WHERE Field1 IN
(
SELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...
)
) AS Result
在这里,我从一个表中选择两组数据,并为Status
列分配两个不同的值(A& B),并将Union设置为一个作为结果。
这个方法的问题是,它需要复制内部选择查询SELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...
(我原来的sql查询比上面显示的有点复杂)
如何将其重写为单个Select查询?有可能吗?
答案 0 :(得分:2)
您可以简单地将WHERE条件移动到CASE表达式,如下所示:
SELECT
*,
CASE
WHEN Field1 IN (
SELECT Field1 FROM Table2 WHERE Field1 = 'val' AND ...
)
THEN 'B'
ELSE 'A'
END AS Status
FROM Table1
;
您也可以像其他人建议的那样使用LEFT JOIN方法,但如果Table2
为指定的过滤器生成重复项,您也可能在输出中获得重复项。为避免这种情况,您可能需要使用仅返回不同值的派生表,如下所示:
SELECT
t1.*,
CASE
WHEN t2.Field1 IS NULL THEN 'A'
ELSE 'B'
END AS Status
FROM Table1 t1
LEFT JOIN (
SELECT DISTINCT Field1 FROM Table2 WHERE Field1 = 'val' AND ...
) t2
ON t1.Field1 = t2.Field2
;
答案 1 :(得分:0)
您可以在此处使用LEFT JOIN
,
SELECT a.*,
CASE WHEN b.field1 IS NULL
THEN 'A'
ELSE 'B'
END AS Status
FROM table1 a
LEFT JOIN table2 b
ON a.field1 = b.field1 AND
b.field1 = 'VAL'
答案 2 :(得分:0)
请检查以下查询,如果Field1=’val’
上只有一个Table2
条件,则该查询有效。如果有多个where条件,请转到LEFT JOIN
。
SELECT
*,
(CASE WHEN Field1='val' THEN 'B' ELSE 'A' END) AS Status
FROM
Table1
答案 3 :(得分:0)
您可以使用LEFT JOIN
和CASE
完成此操作,如下所示
SELECT a.*,
(CASE b.Field1
WHEN 'Val'
THEN 'B' ELSE 'A' END) as status
FROM Table1 a LEFT JOIN Table2 b ON a.field1 =b.field1
如果状态有多个条件,请尝试以下
SELECT a.*,
(CASE
WHEN (SELECT COUNT(Field1)
FROM Table2
WHERE field1 =a.field1 AND Field 1 ='val' AND ...) >0
THEN 'B' ELSE 'A' END) as status
FROM Table1 a LEFT JOIN Table2 b ON a.field1 =b.field1