2016-12-07 57 views
0

我正在製作一個表,其中有一個需要包含唯一值的特定列,我試圖使用this問題的解決方案。不過,我似乎無法正確解決問題。刪除基於表的一列的重複值

這裏是我的SQL:現在

SELECT DISTINCT tabArtikel.ArtCode, tabArtikelLeverancierDetail.AldArtCodeBijLeverancier, 
     tabArtikel.ArtOms, vwKMBVoorraad.MagVoorraad, vwKMBVoorraad.LocNaam, 
     tabArtikelLeverancierDetail.AldInkoopPrijs, tabVoorraadMutatie.VrdMutDatum, tabNawFile.NawFilNummer 
FROM KingSystem.tabArtikel tabArtikel, 
    KingSystem.tabArtikelLeverancier tabArtikelLeverancier, 
    KingSystem.tabArtikelLeverancierDetail tabArtikelLeverancierDetail, 
    KingSystem.tabNawFile tabNawFile, 
    KingSystem.tabVoorraadMutatie tabVoorraadMutatie, 
    KingSystem.vwKMBVoorraad vwKMBVoorraad 
WHERE vwKMBVoorraad.ArtGid = tabArtikel.ArtGid 
    AND tabArtikelLeverancier.ArtLevArtGid = tabArtikel.ArtGid 
    AND tabArtikelLeverancierDetail.AldArtLevGid = tabArtikelLeverancier.ArtLevGid 
    AND tabVoorraadMutatie.VrdMutArtGid = tabArtikel.ArtGid 
    AND tabNawFile.NawFilNawGid = tabArtikelLeverancier.ArtLevNawGid 
    AND ((vwKMBVoorraad.MagVoorraad>0) AND (tabArtikel.ArtCode Not Like 'V%')) 
ORDER BY tabVoorraadMutatie.VrdMutDatum DESC 

,還有一兩件事。在ArtCode重複值被刪除之前,VrdMutDatum的日期需要首先降序排序。

我不知道這是否是所有必要的信息,所以,如果你需要我張貼別的其他然後上面,然後讓我知道

附:我這樣做是因爲輸出包含125K +行,當它應該只有5K行

我從上面的鏈接實現代碼嘗試:

SELECT tabArtikel.ArtCode, tabVoorraadMutatie.VrdMutDatum 
FROM KingSystem.tabArtikel INNER JOIN 
      (SELECT tabVoorraadMutatie.*, ROW_NUMBER() OVER (PARTITION BY ArtCode ORDER BY date DESC) AS seqnum) 
      FROM history tabVoorraadMutatie 
      ) tabArtikel, KingSystem.tabVoorraadMutatie tabVoorraadMutatie 
WHERE tabArtikel.ArtGid = tabVoorraadMutatie.VrdMutArtGid 
ON tabArtikel.ArtCode = tabVoorraadMutatie.VrdMutDatum AND seqnum = 1 
ORDER BY tabArtikel.ArtCode, tabVoorraadMutatie.date 
+1

提示1:較短的表別名! – jarlh

+1

提示2:使用正確的連接語法! – fancyPants

+0

@fancyPants你的意思是INNER JOIN?我嘗試使用郵件中發佈的鏈接中的代碼,但它沒有幫助。我把它編輯爲:(在P.S.下面的部分) –

回答

0

第1步使用表aliasses:

SELECT DISTINCT ta.ArtCode 
     , ta.ArtOms 
     , ldet.AldArtCodeBijLeverancier 
     , ldet.AldInkoopPrijs 
     , vrd.MagVoorraad 
     , vrd.LocNaam 
     , mut.VrdMutDatum 
     , naw.NawFilNummer 
FROM KingSystem.tabArtikel ta 
     , KingSystem.tabArtikelLeverancier tal 
     , KingSystem.tabArtikelLeverancierDetail ldet 
     , KingSystem.tabNawFile naw 
     , KingSystem.tabVoorraadMutatie mut 
     , KingSystem.vwKMBVoorraad vrd 
WHERE vrd.ArtGid = ta.ArtGid 
    AND tal.ArtLevArtGid = ta.ArtGid 
    AND ldet.AldArtLevGid = tal.ArtLevGid 
    AND mut.VrdMutArtGid = ta.ArtGid 
    AND naw.NawFilNawGid = tal.ArtLevNawGid 
    AND vrd.MagVoorraad>0 AND (ta.ArtCode Not Like 'V%' 
--  ORDER BY mut.VrdMutDatum DESC -- nonsens! 
     ; 

步驟#2:使用JOIN語法(和刪除所述不同):


SELECT -- DISTINCT 
     ta.ArtCode 
     , ta.ArtOms 
     , ldet.AldArtCodeBijLeverancier 
     , ldet.AldInkoopPrijs 
     , vrd.MagVoorraad 
     , vrd.LocNaam 
     , mut.VrdMutDatum 
     , naw.NawFilNummer 
FROM KingSystem.tabArtikel ta 
JOIN KingSystem.vwKMBVoorraad vrd ON vrd.ArtGid = ta.ArtGid 
JOIN KingSystem.tabArtikelLeverancier tal ON tal.ArtLevArtGid = ta.ArtGid 
JOIN KingSystem.tabArtikelLeverancierDetail ldet ON ldet.AldArtLevGid = tal.ArtLevGid 
JOIN KingSystem.tabNawFile naw ON naw.NawFilNawGid = tal.ArtLevNawGid 
JOIN KingSystem.tabVoorraadMutatie mut ON mut.VrdMutArtGid = ta.ArtGid 
WHERE vrd.MagVoorraad>0 AND ta.ArtCode Not Like 'V%' 
--  ORDER BY mut.VrdMutDatum DESC -- nonsens! 
     ; 

第三步:添加條件,抑制老突變:


SELECT -- DISTINCT 
     ta.ArtCode 
     , ta.ArtOms 
     , ldet.AldArtCodeBijLeverancier 
     , ldet.AldInkoopPrijs 
     , vrd.MagVoorraad 
     , vrd.LocNaam 
     , mut.VrdMutDatum 
     , naw.NawFilNummer 
FROM KingSystem.tabArtikel ta 
JOIN KingSystem.vwKMBVoorraad vrd 
     ON vrd.ArtGid = ta.ArtGid 
JOIN KingSystem.tabArtikelLeverancier tal 
     ON tal.ArtLevArtGid = ta.ArtGid 
JOIN KingSystem.tabArtikelLeverancierDetail ldet 
     ON ldet.AldArtLevGid = tal.ArtLevGid 
JOIN KingSystem.tabNawFile naw 
     ON naw.NawFilNawGid = tal.ArtLevNawGid 
JOIN KingSystem.tabVoorraadMutatie mut 
     ON mut.VrdMutArtGid = ta.ArtGid 
     AND NOT EXISTS(-- suppress older mutations; keeping only the most recent 
     SELECT * FROM KingSystem.tabVoorraadMutatie mx 
     WHERE mx.VrdMutArtGid = mut.VrdMutArtGid 
     AND mx.VrdMutDatum > mut.VrdMutDatum 
     ) 
WHERE vrd.MagVoorraad > 0 AND ta.ArtCode Not Like 'V%' 
--  ORDER BY mut.VrdMutDatum DESC -- nonsens! 
     ; 

瞧! (那將是約50歐元)


步驟#4:重新排序的列,並添加order by子句


更新:我除去DISTINCT它服務器沒有目的,並且只能隱藏可能的錯誤(並介紹其他,更嚴重錯誤)

+0

謝謝,請嘗試實施你的建議。今天晚些時候會留下反饋 –

+0

它的工作,非常感謝! –