我有以下形狀的資料:
BOM -- 500 rows, 4 cols
PartProject -- 2.6mm rows, 4 cols
Project -- 1000 rows, 5 cols
Part -- 200k rows, 18 cols
然而,當我嘗試這樣做時string_agg,我的代碼將花費我 10 多分鐘的時間來執行 500 行。如何改進此查詢(資料不可用)。
select
BOM.*,
childParentPartProjectName
into #tt2 -- tt for some testing
from #tt1 AS BOM -- tt for some testing
-- cross applys for string agg many to one
CROSS APPLY (
SELECT childParentPartProjectName = STRING_AGG(PROJECT_childParentPart.NAME, ', ') WITHIN GROUP (ORDER BY PROJECT_childParentPart.NAME)
FROM (
SELECT DISTINCT PROJECT3.NAME
FROM [dbo].[Project] PROJECT3
LEFT JOIN [dbo].[Part] P3 on P3.ITEM_NUMBER = BOM.childParentPart
LEFT JOIN [dbo].[PartProject] PP3 on PP3.SOURCE_ID = P3.ID
WHERE PP3.RELATED_ID = PROJECT3.ID and P3.CURRENT = 1
) PROJECT_childParentPart ) PROJECT3
uj5u.com熱心網友回復:
您擁有的子查詢(在子查詢內)有一個代碼“聞起來”,它是有意撰寫的,但不正確。
首先,您LEFT JOIN在子查詢中有 2 ,但是,兩個表都別名為P3并且PP3都需要具有非NULL值;如果沒有找到相關行,這是不可能的。這意味著JOINs 是隱含INNER JOIN的 s。
接下來,當您從多個表中ingDISTINCT時,您將針對單個列;這似乎是錯誤的。非常昂貴,并且您使用它的事實意味著要么不是唯一的,要么由于您的隱含s 您得到重復的行。我猜是后者。因此,很可能您實際上應該使用的是,而不是s。SELECTDISTINCTNAMEINNER JOINEXISTSLEFT JOINsINNER JOIN
以下是一個猜測,但我懷疑它會更高效。
SELECT BOM.*, --Replace this with an explicit list of the columns you need
SA.childParentPartProjectName
INTO #tt2
FROM #tt1 BOM
CROSS APPLY (SELECT STRING_AGG(Prj.NAME, ', ') WITHIN GROUP (ORDER BY Prj.NAME) AS childParentPartProjectName
FROM dbo.Project Prj --Don't use an alias that is longer than the object name
WHERE EXISTS (SELECT 1
FROM dbo.Part P
JOIN dbo.PartProject PP ON P.ID = PP.SOURCE_ID
WHERE PP.Related_ID = Prg.ID
AND P.ITEM_NUMBER = BOM.childParentPart
AND P.Current = 1)) SA;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435474.html
上一篇:對專案進行分組并設定標志
