【问题标题】:Can I use a table from the WITH clause in the IN clause?我可以在 IN 子句中使用 WITH 子句中的表吗?
【发布时间】: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 子句使用表?

【问题讨论】:

    标签: sql db2 common-table-expression readability


    【解决方案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>
                   );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        • 2020-09-27
        • 2017-07-18
        相关资源
        最近更新 更多