是否有可能以某种方式在TD的case语句中使用select子句(而不是执行联接)?
我想做这样的事情:
SELECT
id,
, count(*)
, (CASE WHEN id IN ANY (SELECT DISTINCT ID FROM PARTICIPANTS_TABLE)
THEN 1 ELSE 0
end) AS participant
FROM EVERYONE_TABLE
GROUP BY id
Run Code Online (Sandbox Code Playgroud)
我得到的错误是“ CASE表达式的WHEN子句中的非法表达式”。
您应该将SELECT更改为标量子查询
SELECT
id
, COUNT(*)
, (CASE WHEN id = (SELECT MIN(ID) FROM PARTICIPANTS_TABLE AS p
WHERE p.id = e.id)
THEN 1 ELSE 0
END) AS participant
FROM EVERYONE_TABLE AS e
GROUP BY id
Run Code Online (Sandbox Code Playgroud)
但是我一直遵循的基本规则是避免在“选择”列表中使用标量子查询,以我的经验,这些子查询往往会有较差的优化。
我会将其重写为外部联接(恕我直言,这是人们编写标量子查询的主要原因,在大多数情况下,他们只是隐藏了外部联接):
SELECT
t1.id
, COUNT(*)
, COUNT(t2.ID) AS participant
FROM EVERYONE_TABLE AS t1
LEFT JOIN
(SELECT DISTINCT ID FROM PARTICIPANTS_TABLE) AS t2
ON t1.id = t2.id
GROUP BY t1.id
Run Code Online (Sandbox Code Playgroud)
另外,这种语法更容易理解,至少对我而言:-)