2016-12-07 61 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

它的工作,非常感谢! –