首页 > 解决方案 > 子查询分解不能在 PostgreSQL 中工作

问题描述

当我使用postgresql时,我遇到了一个问题。这是代码:

    WITH t1 AS (
    SELECT
    TABLE_NAME AS TABELA
FROM
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    COLUMN_NAME LIKE 'nu_cns' )
SELECT 
    TABLE_NAME,
    COLUMN_NAME
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_NAME IN t1

如果我运行它,我会得到一个错误:

ERROR:  syntax error at or near "t1"
LINE 14:  TABLE_NAME IN t1
                    ^
SQL state: 42601
Character: 211

但奇怪的是,如果我将 t1 替换为整个子查询,它可以成功运行,如下所示:

    WITH t1 AS (
    SELECT
    TABLE_NAME AS TABELA
FROM
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    COLUMN_NAME LIKE 'nu_cns' )
SELECT 
    TABLE_NAME,
    COLUMN_NAME
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_NAME IN (
    SELECT
    TABLE_NAME AS TABELA
FROM
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    COLUMN_NAME LIKE 'nu_cns' )

你看,实际上子查询和 t1 是一模一样的。那么为什么前者不能工作呢?谢谢!

标签: sqlpostgresqlcommon-table-expression

解决方案


试试下面:你需要在子查询中从 t1 中选择 table_name

WITH t1 AS 
( 
  SELECT TABLE_NAME AS TABELA
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE COLUMN_NAME LIKE 'nu_cns' 
)

SELECT 
    TABLE_NAME,
    COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN (select table_name from t1)

推荐阅读