2016-12-09 68 views
2
Table 1(Validproduct):     Table 2(Registredproduct): 

ProductId Name       ID ProductId Quantity REGISTRATIONID    
1   chair      1 2   10  1111 
2   table      2 2   11  2222   
3   desk 

我所尋找的是下面的結果對客戶ID 1111SQL:從表中獲得列的值在表1中2

Name Quantity 
Table 10 
Chair 0 
Desk  0 

我試過,但它只是給了我存在於Registredproduct產品

SELECT vp.name as 'Product', rp.quantity as 'quantity' 
     FROM Validproduct vp 
     Left JOIN RegistrationProduct rp on 
     vp.ValidproductID = rp.ValidproductID 
     WHERE REGISTRATIONID = 1111 
    enter code here 

,並得到這樣的結果

​​
+0

Left JOIN RegistrationProduct rp on vp.ValidproductID = rp.ValidproductID AND rp.REGISTRATIONID = 1111 – Cyclonecode

+0

將'where'改爲'AND',以便在連接之前應用過濾器。 where子句在連接之後發生並消除左連接的空記錄;實際上使左連接成爲INNER連接。 – xQbert

+0

您的where子句將外部聯接轉換爲內部聯接。將條件包含在連接的on子句中。 – HoneyBadger

回答

1

where子句應用,並在您的結果過濾行。您應該將條件移至連接。此外,您可能需要使用一個​​3210電話用零來代替空計數:應用

SELECT vp.name As Product, COALESCE(rp.quantity, 0) AS Quantity 
FROM  Validproduct vp 
LEFT JOIN RegistrationProduct rp ON 
      vp.ValidproductID = rp.ValidproductID AND REGISTRATIONID = 1111 
+1

其實這就是我所需要的,「COALESCE(rp.quantity,0)。謝謝。它的工作 –

1

與您的查詢的問題是,你的WHERE條款通過在頂層限制REGISTRATIONID將您的外連接到內連接:

SELECT vp.name as 'Product', rp.quantity as 'quantity' 
FROM Validproduct vp 
LEFT JOIN RegistrationProduct rp on vp.ValidproductID = rp.ValidproductID 
WHERE REGISTRATIONID = 1111 -- TOP LEVEL 

這消除了所有的結果,其中有REGISTRATIONID一個行不存在,切兩你想得到的最後結果。

它移動到的加盟將解除限制的級別:

SELECT 
    vp.name as 'Product' 
, rp.quantity as 'quantity' 
FROM Validproduct vp 
LEFT JOIN RegistrationProduct rp 
     on vp.ValidproductID = rp.ValidproductID AND REGISTRATIONID = 1111 

現在你將有NULL的數量。使用空COALESCE表達式來產生零:在加入後

SELECT 
    vp.name as 'Product' 
, COALESCE(rp.quantity, 0) as 'quantity' 
FROM Validproduct vp 
LEFT JOIN RegistrationProduct rp 
     on vp.ValidproductID = rp.ValidproductID AND REGISTRATIONID = 1111 
+1

超棒的人。像魅力一樣工作。 :-) –

+0

@HoneyBadger它解決了我的問題,但我會與穆里尼克的答案一起去,因爲我意識到我需要COALESCE(rp.quantity,0)以及但是非常感謝。 –

1

過濾條件的where子句中的左側或右側加入必須從具有所有記錄的表。否則,您可以使用空值來消除這些記錄。

SELECT vp.name as 'Product', coalesce(rp.quantity,0) as 'quantity' 
FROM Validproduct vp 
LEFT JOIN RegistrationProduct rp 
    on vp.ValidproductID = rp.ValidproductID 
and REGISTRATIONID = 1111 
+0

感謝老闆。我得到了解決方案 –

1

當在「正確」的表中沒有匹配的記錄,左連接產生了創紀錄的加盟,所有從「右」表中的列有NULL值;所以你的WHERE條件不匹配它們。

,最簡單的解決方法是使加入條件的過濾標準的一部分。一般來說,這種方法最簡單 - 只需將條件從WHERE移動到聯合的ON子句即可。其他選項也可能效率較低(儘管我不鼓勵擔心,除非出現性能問題,因爲數據庫管理系統應該優於您或我)。不好的一面是在語義上過濾器不是確實是的一個連接條件,所以它有點駭人聽聞。

SELECT vp.name as 'Product', rp.quantity as 'quantity' 
    FROM Validproduct vp 
     Left JOIN RegistrationProduct rp on 
     vp.ValidproductID = rp.ValidproductID 
     and REGISTRATIONID = 1111 

注意,這一般不會正確的,如果你想超過一個REGISTRATION_ID因爲只有一個「無與倫比」的記錄將每個validproduct記錄生成工作。如果這是一個問題,你可能需要更多的參與。

相關問題