这是我的SQL查询:
SELECT
b.MaakArtikel,
b.Bewerking,
[pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-b.Startdag_backwards) AS Startdatum,
i.Class_06 AS Afdeling,
b.Minuten*10+ISNULL(br.Tijd,0) AS Minuten,
1+ISNULL(br.Orders,0) AS Aantal
FROM [pp].dbo.VW_BEWERKINGSTRUCTUUR b
LEFT OUTER JOIN [211].dbo.Items i
ON b.MaakArtikel = i.ItemCode
LEFT OUTER JOIN [pp].dbo.VW_BEZETTING_RAW br
ON [pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-b.Startdag_backwards) = br.Start
AND i.Class_06 = br.Afdeling
WHERE MaakArtikel = 'HT 10.038'
查询工作正常,但速度有点慢。那是因为我的第二个OUTER JOIN
。我必须通过Startdatum
加入视图(在第4行选择)。由于它不是真正的列名,我不能直接在我的OUTER JOIN
中使用它。这意味着函数[pp].dbo.WORKINGDAYADD()
必须被触发两次(一次在我的选择中,这不是问题,一次在我的OUTER JOIN
中,这是双重工作)。
我可以编写一个存储过程并在变量中使用函数[pp].dbo.WORKINGDAYADD()
的结果,但这是不可取的。有没有办法在我的OUTER JOIN
表达式中使用Startdatum?或者我真的必须使用存储过程吗?
答案 0 :(得分:1)
您可以将函数移动到子查询,如下所示:
SELECT MaakArtikel,
Bewerking,
b.Startdatum,
i.Class_06 AS Afdeling,
Minuten * 10 + ISNULL(br.Tijd,0) AS Minuten,
1 + ISNULL(br.Orders, 0) AS Aantal
FROM ( SELECT *,
StartDatum = [pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000', 0 - Startdag_backwards)
FROM [pp].dbo.VW_BEWERKINGSTRUCTUUR b
) b
LEFT OUTER JOIN [211].dbo.Items i
ON b.MaakArtikel = i.ItemCode
LEFT OUTER JOIN [pp].dbo.VW_BEZETTING_RAW br
ON b.Startdatum = br.Start
AND i.Class_06 = br.Afdeling
WHERE MaakArtikel = 'HT 10.038';
注意强>
我不宽恕使用SELECT *
,在您的工作查询中,您应该只使用[pp].dbo.VW_BEWERKINGSTRUCTUUR
所需的列替换它。
答案 1 :(得分:0)
如何存储
的结果[pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-Startdag_backwards) AS Startdatum
进入SQL变量
DECLARE @myVariable DATETIME
SET @myVariable = [pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-Startdag_backwards)
然后在你的外连接上做这个
ON @myVariable = br.Start
或者那种效果。 波比
答案 2 :(得分:0)
您可以将[pp].dbo.WORKINGDAYADD()
的输出存储在变量中,然后在代码中使用该变量。
(我假设函数的结果数据类型是datetime ..)
DECLARE @StartDatum datetime
SET @StartDatum = ([pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-Startdag_backwards))
SELECT
MaakArtikel,
Bewerking,
@StartDatum,
i.Class_06 AS Afdeling,
Minuten*10+ISNULL(br.Tijd,0) AS Minuten,
1+ISNULL(br.Orders,0) AS Aantal
FROM [pp].dbo.VW_BEWERKINGSTRUCTUUR b
LEFT OUTER JOIN [211].dbo.Items i
ON b.MaakArtikel = i.ItemCode
LEFT OUTER JOIN [pp].dbo.VW_BEZETTING_RAW br
ON br.Start = @StartDatum
AND i.Class_06 = br.Afdeling
WHERE MaakArtikel = 'HT 10.038'