【问题标题】:Compare subquery result with pair of 2 parameters将子查询结果与 2 个参数对进行比较
【发布时间】:2014-01-28 14:48:37
【问题描述】:

我需要将选择查询中的 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)

那么字符串连接是唯一的方法吗?

【问题讨论】:

    标签: sql postgresql subquery


    【解决方案1】:

    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

    【讨论】:

    • 我对 mysql 有同样的问题........我想用数字比较(>= 或
    【解决方案2】:

    您可以使用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;
    

    【讨论】:

    • @user1561346 。 . .我更喜欢 left outer join 方法,因为它是标准 SQL 并且任何数据库都支持。
    【解决方案3】:
    select  *
    from    pupil p
    where   not exists
            (
            select  *
            from    bad_names bn
            where   bn.name = p.name
                    and bn.lastname = p.lastname
            )
    

    【讨论】:

    • 请解释您是如何得出解决方案的,而不仅仅是向 OP 提供答案,以便答案更笼统。
    【解决方案4】:

    您可以使用 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)
    )
    

    【讨论】:

    • 谢谢。如果您将 OR 更改为 AND,它将正常工作。
    猜你喜欢
    • 2013-06-16
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多