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