Могут быть некоторые различия между моим примером и тем, что вы хотите, в зависимости от того, как сформулированы ваши последующие операторы ON. Поскольку вы не указали, я предположил, что все последующие объединения были против первой таблицы.
В моем примере я использовал литералы вместо @ prev, @ current, но вы можете легко заменить переменные вместо литералов для достижения того, что вы хотите.
-- Standin function for your table function to create working example.
CREATE FUNCTION TestMe(
@parm int)
RETURNS TABLE
AS
RETURN
(SELECT @parm AS N, 'a' AS V UNION ALL
SELECT @parm + 1, 'b' UNION ALL
SELECT @parm + 2, 'c' UNION ALL
SELECT @parm + 2, 'd' UNION ALL
SELECT @parm + 3, 'e');
go
-- This calls TestMe first with 2 then 4 then 6... (what you don't want)
-- Compare these results with those below
SELECT t1.N AS AN, t1.V as AV,
t2.N AS BN, t2.V as BV,
t3.N AS CN, t3.V as CV
FROM TestMe(2)AS t1
FULL JOIN TestMe(4)AS t2 ON t1.N = t2.N
FULL JOIN TestMe(6)AS t3 ON t1.N = t3.N;
-- Put your @vars in place of 2,4,6 adding select statements as needed
WITH params
AS (SELECT 2 AS p UNION ALL
SELECT 4 AS p UNION ALL
SELECT 6 AS p)
-- This CTE encapsulates the call to TestMe (and any other joins)
,AllData
AS (SELECT *
FROM params AS p
OUTER APPLY TestMe(p.p)) -- See! only coded once
-- Add any other necessary joins here
-- Select needs to deal with all the columns with identical names
SELECT d1.N AS AN, d1.V as AV,
d2.N AS BN, d2.V as BV,
d3.N AS CN, d3.V as CV
-- d1 gets limited to values where p = 2 in the where clause below
FROM AllData AS d1
-- Outer joins require the ANDs to restrict row multiplication
FULL JOIN AllData AS d2 ON d1.N = d2.N
AND d1.p = 2 AND d2.p = 4
FULL JOIN AllData AS d3 ON d1.N = d3.N
AND d1.p = 2 AND d2.p = 4 AND d3.p = 6
-- Since AllData actually contains all the rows we must limit the results
WHERE(d1.p = 2 OR d1.p IS NULL)
AND (d2.p = 4 OR d2.p IS NULL)
AND (d3.p = 6 OR d3.p IS NULL);
То, что вы хотите сделать, похоже на сводку, поэтому сложность необходимого запроса аналогична созданию результата сводки без использования оператора сводки.
Если бы вы использовали Pivot, дублированные строки (такие как я включил в этот пример) были бы агрегированы. Это также решение для создания центра, где агрегирование нежелательно.