仅基于表的一列删除重复值

时间:2016-12-07 09:10:28

标签: sql database

我正在创建一个表,其中有一个特定列需要包含唯一值,我正在尝试使用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的日期排序为降序。

我不知道这是否是所有必要的信息,所以如果你需要我发布除上述之外的任何其他内容,请告诉我

P.S。我这样做是因为输出包含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 个答案:

答案 0 :(得分:0)

步骤#1使用表别名:

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!
        ;

步骤#3:添加条件以抑制旧突变:

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 It服务器没有用处,只能隐藏可能的错误(并引入其他更严重的错误)