Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在外部联接中使用“选择零件”_Sql_Stored Procedures_Outer Join - Fatal编程技术网

Sql 在外部联接中使用“选择零件”

Sql 在外部联接中使用“选择零件”,sql,stored-procedures,outer-join,Sql,Stored Procedures,Outer Join,这是我的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

这是我的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'
查询工作正常,但有点慢。那是因为我的第二个
外部连接
。我必须通过
Startdatum
(在第4行选择)加入视图。由于它不是真实的列名,我不能在我的
外部联接中直接使用它。这意味着函数
[pp].dbo.WORKINGDAYADD()
必须触发两次(一次在我的选择中,这不是问题,一次在我的
外部联接中,这是双重工作)


我可以编写一个存储过程,并在变量中使用函数
[pp].dbo.WORKINGDAYADD()
的结果,但这是不可重复的。在我的
外部联接
表达式中是否有使用Startdatum的方法?或者我真的必须为此使用存储过程吗?

如何存储您的结果

[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
或者类似的东西。
Bobby

您可以将
[pp].dbo.WORKINGDAYADD()
的输出存储在变量中,然后在代码中使用该变量。 (我假设函数的结果数据类型为datetime.)


您可以将函数移动到子查询,如下所示:

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\u BEWERKINGSTRUCTUUR

中所需的列替换它。
Startdag\u backwards
来自哪个表?@yvytty您想用一个真正的列连接它吗?这是因为没有具有该值的实际列,我必须计算正确的日期en,然后继续it@GarethD
Startdag\u backward
来自
[pp].dbo.VW\u BEWERKINGSTRUCTUUR
,我将编辑我的帖子并添加一些别名来说明这一点
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';