postgresql中的NOT IN子句

4

我将尝试使用NOT IN语句限制选定内容。

这是我的意图:

SELECT name,id
 from "Schemas"."Paths" 
 where id not in(
   select  parent from "Schemas"."Paths"
   )

但是这给了我一个空表。
我的这个表有824行,当我尝试这样做时:
SELECT name,id
 from "Schemas"."Paths" 
 where id in(
   select  parent from "Schemas"."Paths"
   )

我有一个182行的表格。

我缺少什么?


1
考虑到树中每个节点都必须有一个父节点(除了根节点),你基本上排除了每个节点。你想要通过这样做达到什么目的? - Marc B
我理解你的困惑。parent实际上是我表“路径”中的一列。 - Cratein
是的,但那基本上就像在说“天空是蓝色的”。您正在从表中选择记录,并尝试排除其中任何具有父项的记录。由于它们全部都有父项,因此您排除了所有记录。您需要告诉我们您想要使用此查询做什么,因为按照现在的编写方式,它的运行完全正确,但显然并不是您想要的方式。因此,请告诉我们您想要它做什么。 - Marc B
1
我的表格结构是(id,name,parent),它描述了一个XML树。因此,该树的叶子节点不会出现在父列中,因为该列应该是通过当前节点的路径。不确定我是否清楚。我正在尝试选择我的树的所有叶子节点,即:ID从未出现在父列中的行。 - Cratein
"NOT EXISTS( ... )" 是正确的方法。(而被选中的答案是错误的) - wildplasser
嗯...如果我检查了这个答案,那是因为它对我有用。代码示例不起作用,但之前的解释确实有效。但我相信 NOT EXISTS 会起作用。 - Cratein
1个回答

2

很可能您的Paths中至少有一个空父级。根据您打算如何使用这些父级,可以直接过滤掉它们(例如使用WHERE parent IS NOT NULL),或者使用投影函数如COALESCE将其映射到真实存在的内容:

SELECT name,id
 from Paths 
 where id not in (
   select COALESCE(parent, 0) from Paths
);

SqlFiddle演示了NOT IN在序列中包含null时返回零行的情况。


我的表中有一个空的父级。但是父级的类型是字符变量,这似乎是个问题。我得到了这个错误:ERROR: COALESCE 类型字符变量和整数无法匹配。通过“where parent IS NOT NULL”解决了这个问题。 非常感谢。 - Cratein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接