2016-04-30 54 views
0

在數據庫中,我有兩個鏈接表存儲魚着陸的記錄。一項業務要求是這些登陸每週定價一次,然後在一週後發佈,以便讓那些將要付款的個人檢查文書工作。該系統多年來運行良好,但上週用戶設法改變了記錄,使得一種特定種類和大小的魚的定價不同,並因此阻止了其他操作的發生。什麼是最有效的方法來識別具有不同值的行

我現在需要添加一個額外的驗證檢查(即使重複事件的機會很渺茫)。爲此,我設計了一些複製問題的錯誤數據,並設計了查詢的第一個簡單部分來提取它。

這是查詢的第一部分;

SELECT DISTINCT 
    ld.ProductId, ld.UnitPrice 
FROM 
    LandingDetails ld 
JOIN 
    LandingHeaders lh ON ld.LandingId = lh.LandingId 
WHERE 
    lh.LandingDate1 BETWEEN '20160313' AND '20160319' 

這裏是一個返回記錄類型的例子;

enter image description here

正如你可以看到有產品編號的不同的價格上市。從這一點上,我想修改這個,以便它不返回所有不同的ProductId和價格,而是從日期開始返回那些有兩個不同價格的ProductId。我正在尋找的是實現此目標的SQL中最有效的方法。我不需要價格,只需要知道哪個產品ID需要在我尚未編寫的單獨程序中更改其價格即可。

回答

1

最簡單的方法是用一個外部查詢包裹的查詢利用HAVING clause

SELECT q.ProductId 
FROM (
SELECT DISTINCT 
    ld.ProductId, ld.UnitPrice 
FROM 
    LandingDetails ld 
JOIN 
    LandingHeaders lh ON ld.LandingId = lh.LandingId 
WHERE 
    lh.LandingDate1 BETWEEN '20160313' AND '20160319' 
) q 
GROUP BY q.ProductId 
HAVING COUNT(1) >= 2 
+0

簡單而有效,謝謝 –

1

使用exists來檢查ID與不同的價格相匹配的任何記錄:

SELECT DISTINCT ld.ProductId, ld.UnitPrice FROM LandingDetails ld JOIN LandingHeaders lh ON ld.LandingId = lh.LandingId 
WHERE EXISTS (SELECt 1 From LandingDetails ldx WHERE ldx.ProductId = ld.ProductId AND ldx.UnitPrice != ld.UnitPrice) 
+0

謝謝,我一直喜歡存在,但經常忽略它(主要是因爲我總是看起來語法錯誤)。例如,我一直在嘗試調整您的具體答案以獲取分隔日期範圍,但它指出了布爾比較中的錯誤。顯然我需要更多地使用它。 –

2
SELECT 
    ld.ProductId 
FROM 
    LandingDetails ld 
JOIN 
    LandingHeaders lh ON ld.LandingId = lh.LandingId 
WHERE 
    lh.LandingDate1 BETWEEN '20160313' AND '20160319' 
GROUP BY ld.ProductId 
HAVING COUNT(DISTINCT ld.UnitPrice)>1 
+1

與使用DISTINCT的可接受解決方案相比,這應該更有效率(且語法更簡單)。 – dnoeth

1

如果您希望ProductId 的價格不同,您可以利用Group Count

SELECT * 
FROM 
(
    SELECT -- DISTINCT replaced by GROUP BY, because OVER is processed after GROUP 
     ld.ProductId, ld.UnitPrice, 
     COUNT(*) OVER (PARTITION BY ld.ProductId) AS cnt 
    FROM 
     LandingDetails ld 
    JOIN 
     LandingHeaders lh ON ld.LandingId = lh.LandingId 
    WHERE 
     lh.LandingDate1 BETWEEN '20160313' AND '20160319' 
    GROUP BY 
     ld.ProductId, ld.UnitPrice 
) AS dt 
WHERE cnt > 1 
ORDER BY ld.ProductId, ld.UnitPrice 
相關問題