2017-10-10 115 views
1

我一直在做一些研究,但没有找到太多。我需要比较两个表以获取表1中列的列表,但不是表2中的列表。我正在使用雪花。 现在,我找到了这样的回答:postgresql - get a list of columns difference between 2 tables雪花,获取两个表之间的不匹配列表(SQL)

的问题是,当我运行代码,我得到这个错误:如果我单独运行这

SQL compilation error: invalid identifier TRANSIENT_STAGE_TABLE 

的代码工作正常,所以如果我跑:

SELECT column_name 
FROM information_schema.columns 
WHERE table_schema = 'your_schema' AND table_name = 'table2' 

我实际得到的列名的列表,但是当我把它链的第二个表达式,则返回上述错误。 任何暗示发生了什么? 谢谢

回答

1

原帖的查询应该可以正常工作,也许你在某处丢失了单引号?看到这个例子

create or replace table xxx1(i int, j int); 
create or replace table xxx2(i int, k int); 

-- Query from the original post 
SELECT column_name 
FROM information_schema.columns 
WHERE table_name = 'XXX1' 
    AND column_name NOT IN 
    (
     SELECT column_name 
     FROM information_schema.columns 
     WHERE table_name = 'XXX2' 
    ); 
-------------+ 
COLUMN_NAME | 
-------------+ 
J   | 
-------------+ 

你也可以写一个稍微复杂的查询,以查看所有列不匹配,则从两个表:

with 
s1 as (
    select table_name, column_name 
    from information_schema.columns 
    where table_name = 'XXX1'), 
s2 as (
    select table_name, column_name 
    from information_schema.columns 
    where table_name = 'XXX2') 
select * from s1 full outer join s2 on s1.column_name = s2.column_name; 
------------+-------------+------------+-------------+ 
TABLE_NAME | COLUMN_NAME | TABLE_NAME | COLUMN_NAME | 
------------+-------------+------------+-------------+ 
XXX1  | I   | XXX2  | I   | 
XXX1  | J   | [NULL]  | [NULL]  | 
[NULL]  | [NULL]  | XXX2  | K   | 
------------+-------------+------------+-------------+ 

您可以添加WHERE s1.column_name IS NULL or s2.column_name IS NULL找到当然只是缺少列。

您还可以轻松扩展它以检测列类型差异。

相关问题