我正在创建一个表,其中有一个特定列需要包含唯一值,我正在尝试使用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
答案 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服务器没有用处,只能隐藏可能的错误(并引入其他更严重的错误)