在TD的case语句中使用select子句

Dim*_*rov 1 sql teradata

是否有可能以某种方式在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子句中的非法表达式”。

dno*_*eth 5

您应该将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)

另外,这种语法更容易理解,至少对我而言:-)