雪花,获取两个表之间不匹配列的列表(SQL)

Posted

技术标签:

【中文标题】雪花,获取两个表之间不匹配列的列表(SQL)【英文标题】:snowflake, get a list of mismatching columns between two tables (SQL) 【发布时间】:2017-10-10 09:09:54 【问题描述】:

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

问题是当我运行代码时出现这个错误:

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 以仅查找缺失的列。

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

【讨论】:

以上是关于雪花,获取两个表之间不匹配列的列表(SQL)的主要内容,如果未能解决你的问题,请参考以下文章

sql 获取指向特定表,特定列的所有外键约束的列表。

如何使用本机 SQL 在 Hibernate 中获取仅包含选定列的表实体列表?

在SQL中的两个表之间创建外键

两个布尔列/列表是不是匹配?两个不同大小的列的比较:一个列表的一部分是不是与另一个列表的一部分匹配? (Python)

如何获取雪花中的表主键列表?

基于另一列的最大值的列上的 SQL 内连接 [重复]