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)
您必须使用从第一个表到第二个表的CROSS JOIN
每个可能的组合.然后这些与第二个表组合.就像是:name
option
LEFT 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)