我有三张桌子
usertbl
id | fname | lname
---|-------|------
1 | ali | rahimi
2 | reza | miri
citytbl
id | cityname
---|-------
1 | ahvaz
2 | shiraz
3 | mashad
TBl3
Cityid| userid| Value
------|-------|------
1 | 1 | 10
2 | 1 | 30
我想要的结果是:
Cityid| userid| Value
------|-------|------
1 | 1 | 10
2 | 1 | 30
3 | 1 | 0
1 | 2 | 0
2 | 2 | 0
3 | 2 | 0
我试试这个:
SELECT *
FROM usertbl, citytbl
LEFT OUTER JOIN tbl3 ON
(tbl3.cityid=citytbl.id AND
tb.l3.userid=usertbl.id)
但它没有奏效。
答案 0 :(得分:1)
我的方法是:
如果您真的希望每个城市都有每个用户,您可以使用CROSS JOIN
当您最终要添加值时,请使用LEFT JOIN.
要获得0而不是NULL(如果Tbl3中没有匹配项),请使用COALESCE
。
SELECT c.id as Cityid
,u.id as userID
,COALESCE(t3.value,0) as value
FROM usertbl u
CROSS JOIN citytbl c
LEFT OUTER JOIN TBl3 t3
ON t3.userid = u.id
AND t3.cityid = c.id
我还添加了一个rextester来重现它:http://rextester.com/QBRSS10238
注意!
我不建议你在这里使用CROSS JOIN
。你真的需要每个城市的每个用户吗?即使他们没有TBl3的记录?如果有更多的用户和城市,您将拥有大量带有“value = 0
”的记录,并且返回的记录数量会大幅增加。
想象一下,你有一个包含1500个用户和80个城市的桌子。您的CROSS JOIN将返回120.000条记录。即使只有极少数人在表Tbl3中有匹配。
如果您只需要在Tbl3中有条目的用户和城市。使用Tbl3启动选择,然后加入表用户和城市,例如:
SELECT c.id as Cityid
,u.id as userId
,T3.value
FROM TBl3 T3
INNER JOIN usertbl u
ON T3.userid = u.id
INNER JOIN citytbl c
ON T3.Cityid = c.id