我可以在 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 t
与 t
后面的子查询的大小无关。但是您需要 SELECT
与 IN
中使用的任何其他表、视图等一样。
@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 子句中的表吗?的主要内容,如果未能解决你的问题,请参考以下文章
sql server 对已有数据的表,添加核查约束 [失败],请使用with nocheck 子句