首页 > 解决方案 > WITH 子句可以在不使用 Select 语句的情况下具有硬编码值吗?

问题描述

我有一种情况,我需要加入两个不同的数据库(都是 oracle,我没有 DB 链接)才能得到我的结果。我想知道我是否可以使用 WITH 子句创建一个带有所有硬编码值的子查询,以加入其他数据库中的另一个表。我尝试了类似下面的东西

WITH TEMP AS (SELECT '8108428','8110729' FROM DUAL) 

但它将值作为列给出,但我需要它们在一列下作为行,所以我可以加入其他表。有人可以帮我解决吗?我以前使用过 WITH 子句,但其中有一个查询,但这只能采用硬编码值

感谢您的回复!

标签: sqloraclecommon-table-expression

解决方案


您可以创建一个集合类型:

CREATE TYPE varchar2_10_table AS TABLE OF VARCHAR2(10);

然后,如果您期望做某事,例如:

WITH TEMP ( value ) AS (
  SELECT '8108428' FROM DUAL UNION ALL
  SELECT '8110729' FROM DUAL
)
SELECT *
FROM   your_table
WHERE  id IN ( SELECT value FROM temp )

然后你可以WITH用集合替换子句:

SELECT *
FROM   your_table
WHERE  id IN ( SELECT value FROM TABLE( varchar2_10_table( '8108428','8110729' ) ) )

或使用MEMBER OF运算符:

SELECT *
FROM   your_table
WHERE  id MEMBER OF varchar2_10_table( '8108428','8110729' )

或者,如果您想保留该WITH子句并将集合的值解压缩到其中,则:

WITH TEMP ( value ) AS (
  SELECT COLUMN_VALUE FROM TABLE( varchar2_10_table( '8108428','8110729' ) )
)
SELECT *
FROM   your_table
WHERE  id IN ( SELECT value FROM temp )

或者,将集合保留在WITH子句中:

WITH TEMP ( collection_value ) AS (
  SELECT varchar2_10_table( '8108428','8110729' ) FROM DUAL
)
SELECT y.*
FROM   your_table y
       INNER JOIN temp t
       ON ( y.id MEMBER OF t.collection_value )

推荐阅读