我可以在 IN 子句中使用 WITH 子句中的 table 吗?

Can I use a table from the WITH clause in the IN clause?

为了按照 this recommendation 编写更具可读性的 SQL 代码,我尝试使用 WITH 子句。

它在这里工作:

WITH
    t AS
    (
        SELECT
            *
        FROM
            TABLE1
        WHERE
            COL1 = 'foo'
    )
SELECT
    *
FROM
    t
WHERE
    COL2 > 42

但在以下情况下不起作用:

WITH
    t AS
    (
        SELECT
            COL1
        FROM
            TABLE1
    )
SELECT
    *
FROM
    TABLE2
WHERE
    COL2 IN t

它returns出现以下错误:

1) [Code: -206, SQL State: 42703] "T" is not valid in the context where it is used.. SQLCODE=-206, SQLSTATE=42703, DRIVER=4.22.29

以防万一我不清楚上面的非工作查询的意思,这里是:

SELECT
    *
FROM
    TABLE2
WHERE
    COL2 IN
    (
        SELECT
            COL1
        FROM
            TABLE1
    )

如何在 IN 子句中为 WITH 子句使用 table?

IN 需要一个子查询。您只需要:

WHERE COL2 IN (SELECT ? FROM t)

请注意,您需要指定列以及 table。

"T" 充当 table 因此您必须 select 列才能与 "IN"

进行比较
WITH
t AS
(
    SELECT
        COL1
    FROM
        TABLE1
)
SELECT
 *
FROM
TABLE2
WHERE
COL2 IN ( SELECT COL FROM t )

我会使用 exists :

select t2.*
from table2 t2
where exists (select 1 
              from table1 t1
              where t1.COL1 = t2.COL2 and t1.COL1 = <whatever filter>
             );