代码之家  ›  专栏  ›  技术社区  ›  Stuart K. Smith

选择缺少行或零值的查询?

  •  1
  • Stuart K. Smith  · 技术社区  · 8 年前

    我在Postgres一点也不熟练。限制是:我正在使用其他人的数据库,因此无法更改表。Postgres 8.3.3,不允许升级。从Windows通过pgAdmin III访问数据库。

    我遇到了一个快累死我的块。如果一个表中的值在关联表中不存在,我就根本没有返回。桌子 B 具有数字列( C_id )引用数字列的( id )在表中 C 但在表中是可选的 B ,所以可以 0 以指示空。中没有0记录 C.id .

    我想从表中选择一个完整的列表 B 用表中的标签替换数值 C 。只要有匹配的号码,这就可以工作,但如果 B.C_id = 0 我对那张唱片一无所知。So表格 B 有66排,但其中11排 C_id = 0 所以我的输出只有55行。

    WHERE B.C_id = C.id 匹配表似乎排除了不匹配的行( B、 id=0(_id) )但如果我省略它,结果会将66个记录表循环成1300多行输出(将两个表的行相乘)。我的搜索结果显示 COALESCE LEFT JOIN 应该有效,但是 聚结 不改变输出。我猜是因为断开了 0 NULL 。我无法获得任何可供使用的语句 左连接 CASE .

    更为复杂的是,这两个表都是从另一个表中寻址的。结构的简化示例:

    Table A: (id, label, B_id)
    Table B: (id, label, C_id)
    Table C: (id, label)
    

    全部的 身份证件 字段是数字,标签是文本。中的所有记录 A.B_id 包含非零数,但 B.C_id 可能包含 0 。具有的任何表中都不存在行 id = 0 .

    我希望输出如下:

    A.label, C.label
    

    或者,使用 B.C_ID = 0 :

    A.label, 'none'
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Erwin Brandstetter    8 年前

    使用 LEFT [OUTER] JOIN 表格之间 B C 然后 COALESCE 提供 'none' 如果中没有匹配的行,则默认为 C 找到。

    SELECT A.label AS a_label, COALESCE(C.label, 'none') AS c_label
    FROM      A
    JOIN      B ON B.id = A.B_id
    LEFT JOIN C ON C.id = B.C_id;
    

    假设引用完整性介于 A B 我使用 [INNER] JOIN 对于那些。

    Details for joins in the manual.