【问题标题】:Compare table one value with two different tables in postgresql将表一个值与 postgresql 中的两个不同表进行比较
【发布时间】:2014-08-05 20:43:55
【问题描述】:

共有三个表,A、B 和 C 具有公共列(名称和编号)

  1. 表 A 有 10 条记录(比如 x),它们只能来自表 B(比如,y)和表 C(比如,z)(比如,x = y+z)。
  2. 表A中有一些记录的值为0(零)
  3. 我需要使用 column = name 将那些基于零值的记录与其他两个表进行比较。
  4. 并检查表 B 和表 C 中相同“名称”的列“数字”是否也为零 (0)?

我尝试编写以下示例查询来测试我的一组 3 个表数据 - 但由于某些原因,我无法获得所有 10 条记录?

SELECT a.name,a.number as A_number, b.number as B_number, c.number as C_number
from A a, B b, C c
WHERE a.name = b.name

上面的查询在sqlfiddle中给了我如下数据-

http://sqlfiddle.com/#!2/57f86/1

在上面的数据中-没有记录name="hello" 谁能纠正我哪里出错了?以及如何获得确切的结果?我需要表 A 中的所有记录。我知道如果我使用左连接,即使没有匹配,它也会填充所有左表数据。

可能性:表 A 有记录,有些可能存在于表 B 还有一些在表 C 中,但不是在两者上。

【问题讨论】:

  • 使用左连接...sqlfiddle.com/#!2/57f86/2/0我不确定为什么没有加入 C,所以我假设是交叉连接...
  • 但也许你追求的是sqlfiddle.com/#!2/57f86/4/0
  • 在短语检查“数字”列中,“检查”是指“要求”还是“显示”?
  • 我需要显示数字,即使它是零或非零相对于数字 = 0 的表 A 记录。你是对的我也想使用左连接,但是对如何用第三个表实现感到困惑。需要多练习sql :(

标签: sql postgresql join left-join


【解决方案1】:

我想这就是你想要的:

SELECT a.*, b.number as bnumber, c.number as cnumber
from a left outer join
     b
     on a.name = b.name left outer join
     c
     on a.name = c.name
where a.number = 0;

顺便说一下,这是一个Postgres SQL Fiddle。

【讨论】:

    【解决方案2】:

    将 JOIN 关键字添加到 SQL 已经 20 多年了。使用它:

    select
      a.name,
      a.number as A_number,
      b.number as B_number,
      c.number as C_number
    from A a
    left join B b on a.name = b.name
    left join C c on a.name = c.name
    where a.number = 0
    

    这里的关键是使用left join,它允许返回表A中的所有行,即使其他表中没有匹配的行。

    如果您只想在其他表中的数字为零时显示真/假,请执行以下操作:

    select
      a.name,
      a.number as A_number,
      (b.number = 0 and c.number = 0) as zero_elsewhere
    from A a
    left join B b on a.name = b.name
    left join C c on a.name = c.name
    where a.number = 0
    

    【讨论】:

      【解决方案3】:

      当您编写WHERE a.name = b.name 时,它将从表 A 返回的记录限制为仅存在于表 B 中的记录。这不等同于左连接。如果您只使用了 WHERE 语句,您需要这样做:

      WHERE ((a.name = b.name) OR (b.name is NULL))
      AND
      ((a.name = c.name) OR (c.name is NULL))
      

      在 cmets 和其他答案中,他们一直使用LEFT JOIN,它更易于编写和阅读。我建议您采用这种风格,因为它已被广泛接受。

      【讨论】:

        猜你喜欢
        • 2021-03-09
        • 1970-01-01
        • 2020-06-12
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        相关资源
        最近更新 更多