我遇到了一个奇怪的问题 运行 使用 NOT IN 对 PostgreSQL 数据库进行查询并且不明白为什么它不起作用
I hit a weird issue running a query against a PostgreSQL Database using NOT IN and don't understand why it didn't work
我有一个带有 id 和 parent_id 列的分层 table,parent_id 有一个指向 id 列的外键。每行只能有一个父级,但多行可以绑定到同一个父级。我想检索所有没有子项的行。
我尝试使用以下查询进行此操作
SELECT *
FROM table
WHERE id NOT IN (
SELECT DISTINCT(parent_id)
FROM table
)
这返回了 0 行。 如果我将 NOT IN 更改为 IN 它正确returns 有子行的行(其他行通过它们的 parent_id 关联)
我最终成功了:
SELECT *
FROM table
WHERE id NOT IN(
SELECT id
FROM table
WHERE id IN (
SELECT DISTINCT(parent_id)
FROM table
)
)
但我不明白为什么第一个查询不起作用?任何人都可以帮助我了解这里发生了什么吗?我不明白 NOT IN 应该如何工作吗?
尝试
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 │
└──────────┘
但是
with t(x) as (values(1),(2),(null))
select 3
where 3 not in (select x from t);
┌──────────┐
│ ?column? │
├──────────┤
└──────────┘
因为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 │
└──────────┘
我有一个带有 id 和 parent_id 列的分层 table,parent_id 有一个指向 id 列的外键。每行只能有一个父级,但多行可以绑定到同一个父级。我想检索所有没有子项的行。
我尝试使用以下查询进行此操作
SELECT *
FROM table
WHERE id NOT IN (
SELECT DISTINCT(parent_id)
FROM table
)
这返回了 0 行。 如果我将 NOT IN 更改为 IN 它正确returns 有子行的行(其他行通过它们的 parent_id 关联)
我最终成功了:
SELECT *
FROM table
WHERE id NOT IN(
SELECT id
FROM table
WHERE id IN (
SELECT DISTINCT(parent_id)
FROM table
)
)
但我不明白为什么第一个查询不起作用?任何人都可以帮助我了解这里发生了什么吗?我不明白 NOT IN 应该如何工作吗?
尝试
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 │
└──────────┘
但是
with t(x) as (values(1),(2),(null))
select 3
where 3 not in (select x from t);
┌──────────┐
│ ?column? │
├──────────┤
└──────────┘
因为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 │
└──────────┘