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

Posted

技术标签:

【中文标题】我可以在 IN 子句中使用 WITH 子句中的表吗?【英文标题】:Can I use a table from the WITH clause in the IN clause? 【发布时间】:2018-06-14 11:08:27 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

“T”充当表格,因此您必须选择一列才能将其与“IN”进行比较

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

【讨论】:

【参考方案2】:

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

WHERE COL2 IN (SELECT ? FROM t)

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

【讨论】:

但是如果我的子查询很大怎么办?我正在尝试使用WITH 子句来增加可读性。 @r_a:然后创建第二个 CTE(“with”子句) t 后面的查询可能很大。 IN 的子查询不会很大,只是 SELECT ... FROM tt 后面的子查询的大小无关。但是您需要 SELECTIN 中使用的任何其他表、视图等一样。 @a_horse_with_no_name:你能举一个明确的例子吗?【参考方案3】:

我会使用exists

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

【讨论】:

以上是关于我可以在 IN 子句中使用 WITH 子句中的表吗?的主要内容,如果未能解决你的问题,请参考以下文章

NOT IN 子句中的 NULL 值

sql server 对已有数据的表,添加核查约束 [失败],请使用with nocheck 子句

在 where 子句中使用解码,并带有“in”

Hadoop Hive 查询中 IN 子句中的大量 Id

包含使用 with 子句的 sql 的 oracle 管道函数

如何使用SQL中的“With”子句更新值