Sql 将子查询结果与两个参数对进行比较

Sql 将子查询结果与两个参数对进行比较,sql,postgresql,subquery,Sql,Postgresql,Subquery,我需要比较select查询中的2个参数和子查询中的2个参数。 例如: SELECT * FROM pupil WHERE name NOT IN (SELECT name FROM bad_names) 此示例仅包含一个要比较的参数。但如果我需要将子查询结果与两个参数对进行比较,该怎么办? 这将有助于: SELECT * FROM pupil WHERE name||lastname NOT IN ( SELECT name||lastname FROM bad_name_la

我需要比较select查询中的2个参数和子查询中的2个参数。 例如:

SELECT * 
FROM pupil 
WHERE name NOT IN (SELECT name FROM bad_names)
此示例仅包含一个要比较的参数。但如果我需要将子查询结果与两个参数对进行比较,该怎么办? 这将有助于:

SELECT * 
FROM pupil 
WHERE name||lastname NOT IN (
    SELECT name||lastname FROM bad_name_lastname_combinations)

所以字符串连接是实现这一点的唯一方法?

您可以使用NOT EXISTS命令

select  *
from    pupil p
where   not exists
        (
        select  *
        from    bad_names bn
        where   bn.name = p.name
                and bn.lastname = p.lastname
        )
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)
)

您可以使用
左侧外部联接来执行此操作

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;

PostgreSQL具有足够的灵活性,可以通过:

如第4.2.13节所述,这种形式的
不在
中的左侧是行构造函数。右侧是一个带括号的子查询,它返回的列数必须与左侧行中的表达式数完全相同。左侧表达式将按行计算并与子查询结果的每一行进行比较。如果只找到不相等的子查询行(包括子查询不返回行的情况),则
NOT IN
的结果为“true”。如果找到任何相等的行,则结果为“false”

因此,如果您正确编写
行构造函数
,则可以直接执行此操作:

select *
from pupil
where (name, lastname) not in (
  select name, lastname
  from bad_last_name_combinations
)

演示:

请解释您是如何得出解决方案的,而不仅仅是向OP给出答案,以便答案更一般。谢谢。如果您更改或更改,它将正常工作。@user1561346。我更喜欢左外连接方法,因为它是标准的SQL,任何数据库都支持它。。。。。。。。我想用数字(>=或
select *
from pupil
where (name, lastname) not in (
  select name, lastname
  from bad_last_name_combinations
)