如何使用查询连接表?

时间:2017-09-03 10:09:47

标签: sql left-join

我有三张桌子

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)

但它没有奏效。

1 个答案:

答案 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