微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL LEFT OUTER JOIN查询语法

可以说我有一个table1:

id      name
-------------
  1       "one"
  2       "two"
  3       "three"

一个带有第一个外键的table2:

id    tbl1_fk    option   value
-------------------------------
 1      1         1        1
 2      2         1        1
 3      1         2        1
 4      3         2        1

现在我想作为查询结果:

table1.id | table1.name | option | value
-------------------------------------
      1       "one"        1       1
      2       "two"        1       1
      3       "three"    
      1       "one"        2       1
      2       "two"    
      3       "three"      2       1

我如何实现这一目标?

我已经尝试过:

SELECT
  table1.id,table1.name,table2.option,table2.value
FROM table1 AS table1
LEFT outer JOIN table2 AS table2 ON table1.id = table2.tbl1fk

但结果似乎省略了空值:

1    "one"    1   1
2    "two"    1   1
1    "one"    2   1
3    "three"  2   1

解决:感谢Mahmoud Gamal :(加上GROUP BY)
解决了这个问题

SELECT 
  t1.id,t1.name,t2.option,t2.value
FROM
(
  SELECT t1.id,t2.option
  FROM table1 AS t1
  CROSS JOIN table2 AS t2
) AS t1
LEFT JOIN table2 AS t2  ON t1.id = t2.tbl1fk
                       AND t1.option = t2.option
group by t1.id,t2.value
ORDER BY t1.id,t1.name

解决方法

您必须使用CROSS JOIN从第一个表中获取每个可能的名称组合以及第二个表中的选项.然后LEFT JOIN这些组合与第二个表.就像是:

SELECT 
  t1.id,t2.option
  FROM table1 AS t1
  CROSS JOIN table2 AS t2
) AS t1
LEFT JOIN table2 AS t2  ON t1.id = t2.tbl1_fk
                       AND t1.option = t2.option

SQL Fiddle Demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐