SQL只搜索一个LEFT项

时间:2013-08-01 18:59:12

标签: sql performance

我的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)

1 个答案:

答案 0 :(得分: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