将子查询结果与2对参数对比较

时间:2014-01-28 14:48:38

标签: sql postgresql subquery

我需要将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)

所以字符串连接是唯一的方法吗?

4 个答案:

答案 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
)

演示:http://sqlfiddle.com/#!15/a6863/1

答案 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)
)