2016-09-19 54 views
2

我有3个表。SQL Server:选择多个表并显示关系甚至NULL

版本表

___________________ 
id_issue | issue | 
1  | issue A | 
2  | issue B | 
3  | issue C | 
___________________ 

问题表

_______________________ 
id_problem | problem | 
1   | problem A | 
2   | problem B | 
3   | problem C | 
_______________________ 

的Visi表。在2张桌子上有fk

__________________________________________ 
id_visi | visi | id_problem | id_issue | 
1  | visi A |  1  |  1  | 
2  | visi B |  1  |  2  | 
3  | visi C |  1  |  3  | 
4  | visi D |  2  |  1  | 
5  | visi E |  2  |  2  | 
___________________________________________ 

我想合并3张这样的桌子。 : [编辑]

_____________________________________ 
| visi | problem  | issue | 
| visi A | problem A  | issue A | 
| visi B | problem A  | issue B | 
| visi C | problem A  | issue C | 
| visi D | problem B  | issue A | 
| visi E | problem B  | issue B | 
| NULL | problem B  | issue C | 
| NULL | problem C  | issue A | 
| NULL | problem C  | issue B | 
| NULL | problem C  | issue C | 
_____________________________________ 

我曾尝试JOIN表,但它没有工作。结果没有显示NULL的行。

回答

2

你需要的CROSS JOIN & LEFT JOIN

SELECT visi, 
     ip.id_problem, 
     ip.id_issue 
FROM (SELECT * 
     FROM issue I 
       CROSS JOIN problem P) ip 
     LEFT JOIN visi v 
       ON ip.id_problem = v.id_problem 
       AND ip.id_issue = v.id_issue 

CROSS JOIN组合:为了填充两个表(Issue & Problem)之间的所有可能的组合。

LEFT JOIN:从VisiNULL拉数据匹配的记录不匹配的记录

+0

谢谢!有用! – dionajie