Sql 提取集合/列表中不在数据库中的值
我很清楚这有点尴尬,但我正在寻找一种方法来知道集合中哪些值不在我的数据库的表中,换句话说,我需要这样的东西:给定一个表“table”和一个列“column”,让我们假设“column”有一个{“a”,“b”}的域(这些是“column”的所有行所包含的值)以属性“column”为例,如果我们给它一个集合(怎么做?)(假设集合是{“a”,“b”,“c”,“d”}),返回的将是一个表“table”,其中有一列“column”,两个结果是行上的“c”和“d” 有没有可能通过sql请求实现这一点? 我想这在Oracle的双表上是可行的,但由于我在研究Postgres,我需要一些花哨的技巧Sql 提取集合/列表中不在数据库中的值,sql,database,postgresql,Sql,Database,Postgresql,我很清楚这有点尴尬,但我正在寻找一种方法来知道集合中哪些值不在我的数据库的表中,换句话说,我需要这样的东西:给定一个表“table”和一个列“column”,让我们假设“column”有一个{“a”,“b”}的域(这些是“column”的所有行所包含的值)以属性“column”为例,如果我们给它一个集合(怎么做?)(假设集合是{“a”,“b”,“c”,“d”}),返回的将是一个表“table”,其中有一列“column”,两个结果是行上的“c”和“d” 有没有可能通过sql请求实现这一点? 我想
谢谢你的帮助 您可以使用该函数生成一种“虚拟表”
SELECT s.a as "column"
FROM generate_series(ascii('a'), ascii('d')) AS s("column")
LEFT OUTER JOIN mytable t
ON chr(s."column") = t."column"
WHERE t."column" IS NULL;
该查询没有经过测试,但应该可以让您开始
请回复您的评论: 如果您有一个任意的值列表,而不是一系列连续的值,则可以将其转换为公共表表达式(此解决方案已由其他用户发布,但他们随后删除了其答案)
是的,您必须编写应用程序代码,以格式化输入值列表中的查询。+1为了教我generate_series函数,我觉得我还没有清楚地解释我的想法,我的目标是输入一个列表(例如手动输入或从.csv文件输入),并将其值与数据库中的值进行比较(作为回报,有一个包含输入列表中而不是数据库中的值的表)。我认为这在pur SQL中是不可行的,我们需要第三方编程语言来完成这类工作。
WITH s AS (
SELECT 'a' AS "column" UNION ALL
SELECT 'b' UNION ALL
SELECT 'c' UNION ALL
SELECT 'd'
)
SELECT s.a as "column"
FROM s
LEFT OUTER JOIN mytable t
ON s."column" = t."column"
WHERE t."column" IS NULL;