【问题标题】:What is the difference between these two queries of PostgreSQL?PostgreSQL的这两个查询有什么区别?
【发布时间】:2018-02-22 18:01:51
【问题描述】:

这 2 个查询在相同的条件下获取相同的列。但结果仍然不同:

第一次使用联接:

select 
  s.codice as codice,
  n.ragione_sociale as ragione_sociale  
from 
  parco_veicoli pv
right join 
  noleggiatori n on pv.id_noleggiatore = n.id
right join 
  sedi s on pv.id_sede = s.id  
  order by codice, ragione_sociale;

第一个查询总共输出 1323 行。

没有连接的第二个:

SELECT 
  s.codice as codice,
  n.ragione_sociale as ragione_sociale
FROM 
  parco_veicoli pv,  
  noleggiatori n, 
  sedi s
WHERE 
  pv.id_sede = s.id AND
  pv.id_noleggiatore = n.id 
  order by codice, ragione_sociale;

第二个查询总共输出 1321 行。

问题:

谁能告诉我这两个查询的含义是相同的还是不同的?

因为输出几乎相同,但只有结果集(行)的第二个查询比第一个查询少。

【问题讨论】:

  • 你试过执行这两个查询吗?
  • 是的,我在 pg 管理控制台中尝试过。输出几乎与第二个查询的输出中的行数少于第一个查询的行数相同。
  • 第一个查询返回sedi 中的所有行,即使它在表parco_veicoli 中没有匹配项。但是,第二个查询是 INNER JOIN 的旧语法,它仅在存在满足条件的匹配行时才显示行。
  • 是的第一个查询返回来自 sedi 的所有代码。但在第二个查询中,所有代码都不存在。你能解释一下哪个更好吗?

标签: postgresql


【解决方案1】:

https://www.postgresql.org/docs/current/static/queries-table-expressions.html

FROM T1 CROSS JOIN T2 等价于 FROM T1 INNER JOIN T2 ON TRUE (见下文)。也等价于 FROM T1, T2。

右外连接

首先,执行内部连接。然后,对于 T2 中的每一行 与 T1 中的任何行都不满足连接条件,连接的行是 在 T1 的列中添加空值。这是一个相反的 左连接:结果表在 T2 中的每一行总是有一行。

所以在您的查询中,第二个是INNER join,第一个是RIGHT OUTER JOIN

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多