我希望此查詢在不存在記錄的情況下也回傳 1。計數小于 2 或者即使不存在記錄,它也應該回傳 1。
SELECT 1
FROM dbo.Product BS
WHERE BS.ASIN = '072142452X'
GROUP BY ASIN
HAVING COUNT(1) < 2
在表中不存在記錄的情況下,結果應為 1。
表中所有產品的串列
Product
Id ASIN
1 12A
2 12B
3 1AC
4 123
5 12D
賬戶清單
Account
Id Name
1 A
2 B
3 C
現在串列發生在各種帳戶中
產品串列在各個帳戶中列出(產品 ID 和帳戶組合是唯一的。意味著一個產品只會在一個帳戶中列出一次)
ProductListing
Id ProductId AccountId
1 2 1
2 1 1
3 4 1
4 2 2
5 4 2
6 5 3
如果產品已經在一個帳戶或兩個不同的帳戶中列出,我希望它不應該出現在我對列出產品的查詢中
查詢3號賬號上市產品,所以3號以上已經上市的商品不應該出現在2個以上賬戶
Select P.Id, P.ASIN
FROM dbo.Product P
WHERE NOT EXISTS (
SELECT 1
FROM dbo.ProductListing PL
WHERE P.Id = PL.ProductId AND AccountId = 3
) AND EXISTS (
SELECT 1
FROM dbo.ProductListing PL
WHERE P.Id = PL.ProductId
GROUP BY PL.ProductId
HAVING COUNT(1) < 2
)
uj5u.com熱心網友回復:
您可以對回傳的行數使用CASE運算式,如下所示。
DECLARE @Asin varchar(10) = '072142452X';
SELECT
CASE WHEN (
SELECT COUNT(*)
FROM dbo.Product BS
WHERE BS.[ASIN] = @Asin
) < 2 THEN 1 ELSE 0 END;
GROUP BY注意:當您已經過濾到 1 時,沒有理由這樣做ASIN。
根據您的編輯,您可以修改查詢以使用與我已經顯示的相同的子查詢,如下所示:
SELECT P.Id, P.[ASIN]
FROM dbo.Product P
WHERE NOT EXISTS (
SELECT 1
FROM dbo.ProductListing PL
WHERE PL.ProductId = P.Id AND AccountId = 3
) AND (
SELECT COUNT(*)
FROM dbo.ProductListing PL
WHERE PL.ProductId = P.Id
) < 2;
uj5u.com熱心網友回復:
放下你的GROUP BY線。
考慮一下這將如何始終給出一行:
SELECT COUNT(1)
FROM dbo.Product BS
WHERE BS.ASIN = '072142452X'
但這GROUP BY意味著您每組回傳一行,并且您沒有任何組,因為您正在過濾掉本來可以創建一個的行。
所以這就是你想要的。
SELECT 1
FROM dbo.Product BS
WHERE BS.ASIN = '072142452X'
Having Count(1) < 2
附錄:我這樣寫是因為它最接近 OP 的原始形式。但是另一種選擇,它不會被 GROUP BY 和 HAVING 的細微差別所吸引:
SELECT 1
WHERE (
SELECT COUNT(1)
FROM dbo.Product BS
WHERE BS.[ASIN] = '072142452X'
) < 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/422538.html
標籤:
