【问题标题】:Join between two tables with same fields在具有相同字段的两个表之间连接
【发布时间】:2020-03-03 11:13:28
【问题描述】:

我有这些桌子:

FT
id|Rif1|Rif2|CodCli|Data1|Data2

FR
id|Rif1|Rif2|Qta|Price

我想使用两个表中的 Rif1 和 Rif2 加入来自 Codcli 的结果过滤(包含相同的值) 我这样做:

SELECT FT."Rif1", FR."Rif1", FT."Rif2", FR."Rif2", "Data1", "Data2", "Qta", "Price", "CodCli"
FROM FT, FR
WHERE FT."CodCli" = '653' AND (FT."Rif1" = FR."Rif1" AND FT."Rif2" = FR."Rif2");

但结果是错误的,我想要表 FT 中与过滤后的 Codcli 相关的所有数据,但另外还有由 Rif1 和 Rif2 相关字段连接的表 FR 中的数据。

【问题讨论】:

  • 与你的问题无关,但是:你真的应该避免那些可怕的引用标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…
  • 您的代码中有拼写错误 (FT."Rif1" = FR."Rif1 AND FT."Rif2" = FR."Rif2") 应该是 (FT."Rif1" = FR."Rif1" AND FT."Rif2" = FR."Rif2") 不确定是否相关。
  • 我知道结构很乱,但我无法修改它,我必须使用这些字段提取数据:(
  • 也许我必须使用一些 INNER JOIN 或 LEFT OUTER JOIN?

标签: sql postgresql join


【解决方案1】:

我想要表 FT 中与过滤后的 Codcli 相关的所有数据

这听起来像LEFT JOIN

SELECT FT."Rif1", FR."Rif1", FT."Rif2", FR."Rif2", 
       "Data1", "Data2", "Qta", "Price", "CodCli"
FROM FT LEFT JOIN
     FR
     ON FT."Rif1" = FR."Rif1" AND FT."Rif2" = FR."Rif2"
WHERE FT."CodCli" = '653';

【讨论】:

    【解决方案2】:

    如果这对您有用,请尝试使用 LEFT JOIN:

    SELECT FT."Rif1", FR."Rif1", FT."Rif2", FR."Rif2", "Data1", "Data2", "Qta", "Price", "CodCli"
    FROM FT LEFT JOIN FR ON FT."Rif1" = FR."Rif1" AND FT."Rif2" = FR."Rif2" where FT."CodCli" = '653';
    

    【讨论】:

      【解决方案3】:

      在您的情况下,postgresql 从第二个表中选择数据,然后使用您的 where 条件从第一个表中获取所有数据。那就是你得到错误的结果。 使用left join。在这种情况下,系统从具有条件的第一个表中获取数据,然后加入第二个表。所以

      SELECT FT."Rif1", FR."Rif1", FT."Rif2", FR."Rif2", "Data1", "Data2", "Qta", "Price", "CodCli"
      FROM FT
      LEFT JOIN FR ON FT."Rif1" = FR."Rif1" AND FT."Rif2" = FR."Rif2"
      WHERE FT."CodCli" = '653';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        相关资源
        最近更新 更多