我需要将select查询中的2个参数与子查询中的2个参数进行比较。 示例:
SELECT *
FROM pupil
WHERE name NOT IN (SELECT name FROM bad_names)
此示例仅包含一个要比较的参数。但是如果我需要将子查询结果与2对参数进行比较呢? 这将有效:
SELECT *
FROM pupil
WHERE name||lastname NOT IN (
SELECT name||lastname FROM bad_name_lastname_combinations)
所以字符串连接是唯一的方法吗?
答案 0 :(得分:4)
PostgreSQL足够灵活,可以使用row constructor and NOT IN:
执行此操作row_constructor NOT IN (subquery)
此
NOT IN
形式的左侧是行构造函数,如第4.2.13节中所述。右侧是带括号的子查询,它必须返回与左侧行中的表达式完全相同的列。评估左侧表达式并逐行与子查询结果的每一行进行比较。如果只找到不相等的子查询行,则NOT IN
的结果为“true”(包括子查询不返回任何行的情况)。如果找到任何相等的行,结果为“false”。
如果你正确地写row_constructor
:
select *
from pupil
where (name, lastname) not in (
select name, lastname
from bad_last_name_combinations
)
答案 1 :(得分:3)
您可以使用left outer join
:
SELECT p.*
FROM pupil p left outer join
bad_name_lastname_combinations bnlc
on p.name = bnlc.name and p.lastname = bnlc.lastname
WHERE bnlc.name is null;
答案 2 :(得分:2)
select *
from pupil p
where not exists
(
select *
from bad_names bn
where bn.name = p.name
and bn.lastname = p.lastname
)
答案 3 :(得分:0)
您可以使用NOT EXISTS命令
SELECT *
FROM pupil p
WHERE NOT EXISTS
(
SELECT 1
FROM bad_name_lastname_combinations b
WHERE b.name = p.name AND b.lastname = p.lastname)
)