PostgreSQL LEFT OUTER JOIN查询语法

kos*_*sta 5 sql postgresql left-join cross-join

可以说我有一个table1:

  id      name
-------------
  1       "one"
  2       "two"
  3       "three"
Run Code Online (Sandbox Code Playgroud)

和第一个table2外键:

id    tbl1_fk    option   value
-------------------------------
 1      1         1        1
 2      2         1        1
 3      1         2        1
 4      3         2        1
Run Code Online (Sandbox Code Playgroud)

现在我想作为查询结果:

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
Run Code Online (Sandbox Code Playgroud)

我如何实现这一目标?

我已经尝试过:

SELECT
  table1.id,
  table1.name,
  table2.option,
  table2.value
FROM table1 AS table1
LEFT outer JOIN table2 AS table2 ON table1.id = table2.tbl1fk
Run Code Online (Sandbox Code Playgroud)

但结果似乎省略了空值:

1    "one"    1   1
2    "two"    1   1
1    "one"    2   1
3    "three"  2   1
Run Code Online (Sandbox Code Playgroud)

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

SELECT 
  t1.id,
  t1.name,
  t2.option,
  t2.value
FROM
(
  SELECT t1.id, t1.name, 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, t1.name, t2.option, t2.value
ORDER BY t1.id, t1.name
Run Code Online (Sandbox Code Playgroud)

Mah*_*mal 8

您必须使用从第一个表到第二个表的CROSS JOIN每个可能的组合.然后这些与第二个表组合.就像是:nameoptionLEFT JOIN

SELECT 
  t1.id,
  t1.name,
  t2.option,
  t2.value
FROM
(
  SELECT t1.id, t1.name, 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
Run Code Online (Sandbox Code Playgroud)

SQL小提琴演示