2016-05-20 131 views
-4

加入我有這個表:SQL Server。獲取零在內的額頭

PRODUCTS(product_id, name, price) 
(1,'Apple', $10) 
(2,'Cherry', $20) 
(3,'Watermelon', $30) 

而且這樣的:

STOCK(product_id, number) 
(1,5) 
(1,3) 
(2,5) 

有了這個:

SELECT 
    PRODUCTS.product_id, 
    SUM(STOCK.number), 
FROM 
    STOCK 
    INNER JOIN PRODUCTS ON PRODUCTS.product_id = STOCK.product_id 
GROUP BY 
    PRODUCTS.product_id 

我能得到這個:

(Apple, 8) 
(Cherry, 5) 

但我希望得到這個:

(Apple, 8) 
(Cherry, 5) 
(Watermelon, 0) 

這在MySQL中可實現與右連接,但在SQL Server沒有,就如何實現這一目標的任何想法?

+0

我在您的表格中看不到codbar – Mihai

+0

我認爲您沒有向我們展示您的正確查詢。 SQL Server中的RIGHT JOIN與MySQL中的相同。這應該工作。你可以創建一個可重複的腳本或SQLFiddle嗎?爲什麼在問題標題中提到「內部聯接」? –

+0

對不起,我不會說英語。我在我的數據庫中有一個不同的查詢,並且「翻譯」有點不對勁hehehehe – LuisEduardoSP

回答

1

您可以使用LEFT JOIN

SELECT 
    PRODUCTS.product_id, 
    COALESCE(SUM(STOCK.number), 0) 
FROM 
    PRODUCTS 
    LEFT JOIN STOCK ON PRODUCTS.product_id = STOCK.product_id 
GROUP BY 
    PRODUCTS.product_id 

注:RIGHT JOIN也是SQL Server以及語法是一樣的在MySQL。

Demo here

+0

爲什麼這會產生與他當前的RIGHT JOIN不同的結果? –

+0

@TabAlleman它不會,它只是更簡單,更直觀(我認爲)。 –

+0

謝謝,但它不起作用。 – LuisEduardoSP

1

使用LEFT JOIN如下,並使用ISNULL()在沒有庫存的存在是爲了SUM 0。

DECLARE @PRODUCTSTABLE TABLE (product_id INT, name VARCHAR(10), price MONEY) 
DECLARE @STOCK TABLE (product_id INT, number INT) 
INSERT INTO @PRODUCTSTABLE 
VALUES 
(1,'Apple', 10), 
(2,'Cherry', 20), 
(3,'Watermelon', 30) 

INSERT INTO @STOCK 
VALUES 
(1,5), 
(1,3), 
(2,5) 

SELECT P.name, SUM(ISNULL(S.number,0)) 
FROM @PRODUCTSTABLE P 
LEFT JOIN @STOCK S ON P.product_id=S.product_id 
GROUP BY P.name 
+0

我正在刪除我的答案,因爲另一個包含的錯誤太多。 – JiggsJedi

+0

謝謝,這是我需要的例子。 – LuisEduardoSP