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

时间:2018-06-14 11:08:28

标签: sql db2 common-table-expression readability

尝试按照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

它返回以下错误:

  

1)[代码:-206,SQL状态:42703]“T”在上下文中无效   在哪里使用.. SQLCODE = -206,SQLSTATE = 42703,DRIVER = 4.22.29

以防万一我不清楚上述非工作查询的含义,以下是:

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

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

3 个答案:

答案 0 :(得分:3)

" T"作为一个表,所以你必须选择一个列,以便与" IN"进行比较。

{{1}}

答案 1 :(得分:1)

IN需要子查询。你只需要:

WHERE COL2 IN (SELECT ? FROM t)

请注意,您需要指定列和表格。

答案 2 :(得分:0)

我会使用exists

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