我遇到了一个奇怪的问题,使用notin和don'对PostgreSQL数据库运行查询;我不明白为什么它没有';行不通
我有一个带有id和parent_id列的分层表,parent_id有一个id列的外键。每行只能有一个父行,但多行可以绑定到同一父行。我想检索所有没有子项的行 我尝试了以下查询我遇到了一个奇怪的问题,使用notin和don'对PostgreSQL数据库运行查询;我不明白为什么它没有';行不通,sql,postgresql,subquery,notin,Sql,Postgresql,Subquery,Notin,我有一个带有id和parent_id列的分层表,parent_id有一个id列的外键。每行只能有一个父行,但多行可以绑定到同一父行。我想检索所有没有子项的行 我尝试了以下查询 SELECT * FROM table WHERE id NOT IN ( SELECT DISTINCT(parent_id) FROM table ) 这返回了0行。如果我将不在中更改为在中,它将正确返回有子行的行(其他行通过其父id与之关联) 我最终让它工作了: SELECT * FROM tabl
SELECT *
FROM table
WHERE id NOT IN (
SELECT DISTINCT(parent_id)
FROM table
)
这返回了0行。如果我将不在中更改为在中,它将正确返回有子行的行(其他行通过其父id与之关联)
我最终让它工作了:
SELECT *
FROM table
WHERE id NOT IN(
SELECT id
FROM table
WHERE id IN (
SELECT DISTINCT(parent_id)
FROM table
)
)
但我不明白为什么第一个查询不起作用?有人能帮我弄明白这里发生了什么吗?我不明白不在应该如何工作吗?试试看
SELECT *
FROM table
WHERE id NOT IN (
SELECT DISTINCT(parent_id)
FROM table
WHERE parent_id IS NOT NULL
)
例如:
with t(x) as (values(1),(2))
select 3
where 3 not in (select x from t);
┌──────────┐
│ ?column? │
├──────────┤
│ 3 │
└──────────┘
但是
这是因为DBMS无法决定是否为id=null
(结果是undefined
)
您可以如上所述或使用not exists
修复它:
with t(x) as (values(1),(2),(null))
select 3
where not exists (select x from t where x = 3);
┌──────────┐
│ ?column? │
├──────────┤
│ 3 │
└──────────┘
with t(x) as (values(1),(2),(null))
select 3
where not exists (select x from t where x = 3);
┌──────────┐
│ ?column? │
├──────────┤
│ 3 │
└──────────┘