0

我的 SQL 查询确实需要很多时间,所以我认为可能有更好的编写方法。

表“Vorgangdetails”有一个项目,该项目在“RecId”中有一个数字。这个数字可能在“WeiterfuehrungVonPos”中的不同行。如果是这样,这个新行在“RecId”中有一个数字,它可能再次在“WeiterfuehrungVonPos”中的不同行中......(总共最多 3 次)我的查询太长了。知道更快的方法吗?

SELECT 
    SUM(VD_AB.Menge) AS Amount,
    Artikel.Artikelnummer AS Artikelnummer,
FROM Artikel

    INNER JOIN Vorgangdetails AS VD_AB
        ON LEFT(VD_AB.Auftrag, 3) = 'AF-'
        AND Artikel.Artikelnummer = VD_AB.Artikel

--> 从与 VD_AB 相同的表中添加最多 1 个结果

    LEFT JOIN Vorgangdetails AS VD_L
        ON LEFT(VD_L.Auftrag, 3) = 'LF-'
        AND Artikel.Artikelnummer = VD_L.Artikel
        AND VD_L.WeiterfuehrungVonPos = VD_AB.RecId

--> 再次...从与 VD_AB 相同的表中添加最多 1 个结果

    LEFT JOIN Vorgangdetails AS VD_RvL
        ON VD_L.RecID = VD_RvL.WeiterfuehrungVonPos
        AND LEFT(VD_RvL.Auftrag, 3) = 'RE-'

--> 再次...从与 VD_AB 相同的表中添加最多 1 个结果

    LEFT JOIN Vorgangdetails AS VD_RvAB
        ON VD_AB.RecID = VD_RvAB.WeiterfuehrungVonPos
        AND LEFT(VD_RvAB.Auftrag, 3) = 'RE-'

WHERE (VD_RvAB.Auftrag = '' AND VD_RvL.Auftrag = '')

GROUP BY(Artikelnummer)

. .

最终结果) -------------- 编辑以反映 Roman Pekar 的所有答案

SELECT 
    SUM(VD_AB.Menge) AS Auftragsmenge,
    Artikel.Artikelnummer AS Artikelnummer,
FROM Artikel
    INNER JOIN Vorgangdetails AS VD_AB
        ON VD_AB.Auftrag LIKE 'AB-%'
        AND Artikel.Artikelnummer = VD_AB.Artikel
    LEFT JOIN Vorgangdetails AS VD_L
        ON Artikel.Artikelnummer = VD_L.Artikel
        AND VD_L.WeiterfuehrungVonPos = VD_AB.RecId
        AND (VD_L.Auftrag LIKE 'LF-%' OR VD_L.Auftrag LIKE 'RE-%')
    LEFT JOIN Vorgangdetails AS VD_RvL
        ON VD_L.Auftrag is not null
        AND VD_L.Auftrag LIKE 'LF-%'
        AND VD_L.RecID = VD_RvL.WeiterfuehrungVonPos
        AND VD_RvL.Auftrag LIKE 'RE-%'
WHERE (Artikel.Kategorie = 'KARSTADT->Aktive')
    AND (VD_L.Auftrag LIKE 'LF-%' AND VD_RvL.Auftrag = '')
    AND NOT (VD_L.Auftrag LIKE 'RE-%')
GROUP BY(Artikelnummer)
4

1 回答 1

2

首先 - 避免在参与连接的列上使用函数,这样做时查询不能使用索引。接下来,尝试检查您在连接表的列上是否确实有索引。

当您只想比较字符串的一部分时,可以使用类似比较。这里是 SQL Server 的查询(我不知道您使用的是哪个 RDBMS):

select
    sum(VD_AB.Menge) as Amount,
    Artikel.Artikelnummer as Artikelnummer,
from Artikel
    inner join Vorgangdetails as VD_AB on
        VD_AB.Auftrag like 'AF-%' and VD_AB.Artikel = Artikel.Artikelnummer
    left outer join Vorgangdetails as VD_L on
        VD_L.Auftrag like 'LF-%' and VD_L.Artikel = Artikel.Artikelnummer and
        VD_L.WeiterfuehrungVonPos = VD_AB.RecId
    left outer join Vorgangdetails as VD_RvL on
        VD_RvL.Auftrag like 'RE-%' and
        VD_RvL.WeiterfuehrungVonPos = VD_L.RecID and
        VD_L.Auftrag is not null
    left outer join Vorgangdetails as VD_RvAB on
        VD_RvAB.Auftrag like 'RE-%' and
        VD_RvAB.WeiterfuehrungVonPos = VD_AB.RecID
where VD_RvAB.Auftrag = '' and VD_RvL.Auftrag = ''
group by Artikelnummer
于 2013-08-01T19:08:51.203 回答