2017-09-03 31 views
0

我有三個表如何用查詢離開連接表?

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

什麼是表「usertbl」和「citytbl」之間的連接條件? –

+0

@EstebanP。沒有條件...我想讓每個城市的每個用戶都擁有 –

+0

不要將逗號分隔的隱式聯接與顯式JOIN混合在一起。太困惑了我們大多數人。 – jarlh

回答

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到herer重現: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 
+0

謝謝:)它的工作原理...我想用where子句過濾用戶和城市...你能幫我嗎? –

+0

@SedigheRahimi很高興聽到它的作品。要篩選結果:先嚐試一下,然後使用stackoverflow搜索。最好是花點功夫去解決它,因爲你會學到很多東西,而不是等待別人來解決它。 –

+0

謝謝你......好的,我會這麼做的。 –