2015-04-15 58 views
0

我想問問是否有辦法修改我的SQL Select語句以防止冗餘行如下所示。SQL中的冗餘行選擇加入

SELECT tblIssueCommsItem.ItemID, cardNo, tblIssueCommsEqp.currentQty FROM tblIssueCommsItem 
INNER JOIN tblCommsItem ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID 
INNER JOIN tblIssueCommsEqp ON tblIssueCommsItem.EqpID = tblIssueCommsEqp.EqpID 
INNER JOIN tblSetInfo ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID 
WHERE SetID = 11 AND (cardNo = 'TK 14' OR cardNo = '') AND cardNo != 'Unassigned' 
AND tblIssueCommsItem.VoucherNo = 10006102 AND tblIssueCommsEqp.currentQty > 0 
ORDER BY cardNo, serial 

我得到什麼:

ItemID: 1386, cardNO: *blank*, currentQty: 10 
ItemID: 1386, cardNO: *blank*, currentQty: 1 
ItemID: 1387, cardNO: *blank*, currentQty: 10 
ItemID: 1387, cardNO: *blank*, currentQty: 1 
ItemID: 1101, cardNO: TK 14, currentQty: 10 
ItemID: 1101, cardNO: TK 14, currentQty: 1 
ItemID: 2575, cardNO: TK 14, currentQty: 10 
ItemID: 2575, cardNO: TK 14, currentQty: 1 

SetInfo包含屬於一組不同的EqpIDs。在這種情況下,集是SetID 11.我想實現的是以下幾點:

ItemID: 1386, cardNO: *blank*, currentQty: 10 
ItemID: 1387, cardNO: *blank*, currentQty: 10 
ItemID: 1101, cardNO: TK 14, currentQty: 10 
ItemID: 2575, cardNO: TK 14, currentQty: 10 

我實現了冗餘行只有當我在一組,由此cardNO = 'TK 14'有超過1個項目出現。如您所見,冗餘行是currentQty = 1。我的數據庫中沒有這樣的記錄。我認爲它只顯示爲1,因爲它是一個int字段。與currentQty是不同的,這些不是真正重複的行,因此我不能使用DISTINCT擺脫它。

我的JOIN的概念不好,但我嘗試了各種各樣的JOIN它產生完全相同的結果。

任何幫助表示讚賞!

更新:問題已解決。感謝那些澄清了不提供默認整數的SQL行爲的人。 tblIssueCommsEqp.*,幫助我找出罪魁禍首,並意識到我需要兩個tblIssueCommsEqp.VoucherNo = 10000602 and tblIssueCommsItem.VoucherNo = 1000602才能得到我想要的。由於我的概念仍然很薄弱,我仍然不確定爲什麼如果我在一組中只有1件'TK 14',一切都按正常方式工作。

對於幫助修改我的陳述的答案,這些答案可能也有用,但它們有點作弊,我只會用它作爲最後的手段。

+0

必須有tblIssueCommsEqp行(多個)具有currentQty = 1,如果其涉及到的結果。如果將tblIssueCommsEqp。*添加到select中,您應該能夠確定它是哪一行。另外,檢查表中的主鍵/唯一約束,以檢查它們中的一個是否從聯接中缺失。 「 –

+0

」'冗餘行是currentQty爲1的行。在我的數據庫中沒有這樣的記錄。''再看一次,**必須在數據庫中有'currentQty = 1'的記錄,即使數據庫只是填充默認整數(它不會做),默認整數是0,不是1. –

+0

感謝您的幫助,JamesZ和Joel。tblIssueCommsEqp。*對我來說是新的,因爲我有太多記錄,所以真的幫了我很大忙,請把它當作答案。 – DxHito

回答

0

假設SQL Server中,是這樣的:

group by tblIssueCommsItem.ItemID, cardNo, tblIssueCommsEqp.currentQty 
having max(tblIssueCommsEqp.currentQty) 

不知道將通過與秩序工作,但應該讓你在正確的方向有希望:)

0

我想你想:

SELECT 
    tblIssueCommsItem.ItemID, 
    cardNo, 
    MAX(tblIssueCommsEqp.currentQty) 
FROM 
    tblIssueCommsItem 
    INNER JOIN tblCommsItem 
    ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID 
    INNER JOIN tblIssueCommsEqp 
    ON tblIssueCommsItem.EqpID = tblIssueCommsEqp.EqpID 
    INNER JOIN tblSetInfo 
    ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID 
WHERE 
    SetID = 11 
    AND (
     cardNo = 'TK 14' 
     OR cardNo = '' 
    ) 
    AND cardNo != 'Unassigned' 
    AND tblIssueCommsItem.VoucherNo = 100006102 
    AND tblIssueCommsEqp.currentQty > 0 
GROUP BY 
    tblIssueCommsItem.ItemID, 
    cardNo 
ORDER BY 
    cardNo 
0

試試這個:

SELECT tblIssueCommsItem.ItemID, cardNo, q.currentQty 
FROM tblIssueCommsItem 
INNER JOIN tblCommsItem ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID 
INNER JOIN 
(
    select EqpID, MAX(currentQty) as currentQty 
    from tblIssueCommsEqp 
    group by EqpID 
    having max(currentQty) > 0 
) q ON tblIssueCommsItem.EqpID = q.EqpID 
INNER JOIN tblSetInfo ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID 
WHERE SetID = 11 AND (cardNo = 'TK 14' OR cardNo = '') 
    AND tblIssueCommsItem.VoucherNo = 100006102 
    -- The below line is redundant, though it may still be useful in matching an index 
    -- AND cardNo != 'Unassigned' 
ORDER BY cardNo, serial 
0

這可能有幫助。我認爲包括max函數將幫助既然你有最大內置功能,刪除tblIssueCommsEqp.currentQty> 0條件where子句。

SELECT tblIssueCommsItem.ItemID, cardNo, Max(tblIssueCommsEqp.currentQty) 
FROM tblIssueCommsItem 
INNER JOIN tblCommsItem ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID 
INNER JOIN tblIssueCommsEqp ON tblIssueCommsItem.EqpID = tblIssueCommsEqp.EqpID 
INNER JOIN tblSetInfo ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID 
WHERE SetID = 11 
AND (cardNo = 'TK 14' OR cardNo = '') 
AND cardNo != 'Unassigned' 
AND tblIssueCommsItem.VoucherNo = 100006102 
ORDER BY cardNo, serial;