-2

我有一个足够复杂的 SPROC,我对其进行了修改以返回更多列(来自其他表)。

我想要的是让这个 SPROC 仍然返回相同数量的行和相同的数据,但也为这些行填充新列(如果数据存在)。我的修改确实填充了新列,但也返回了更多行(基于它找到那些附加表的值)。

这是附加表的示例:

表 FCB:

FCBID 发票编号 FCBID代码 CB代码 FCBJrnID
ABC1 718 abcC1 CB1 0 1234
ABC2 718 abcC2 CB1 0 1234
ABC3 718 abcC3 CB1 0 1234
DEF1 718 abcC4 CB1 0 1234
防御2 718 ABCC5 CB1 0 1234
防御3 718 abcC6 CB1 0 1234
BBB2 334 ABCC7 CB2 1 3333
AAA5 225 ABCC8 CB3 0 4444

表发票:

发票编号 产品编号 曲目编号
334 P4 T7
718 P1 T1
718 P2 T1
225 P5 T5
225 P6 T6
718 P3 T1
718 P9 T1
718 P3 T2
718 P9 T2
718 P1 T2
718 P2 T2

表 FCBAP:

FCBID 产品编号 曲目编号
ABC1 P1 T1
ABC2 P2 T1
ABC3 P3 T1
DEF1 P1 T2
防御2 P2 T2
防御3 P3 T2
BBB2 P4 T3

原始 SPROC(它的主要部分)围绕 InvoiceID 和 ProdID,当我执行原始 SPROC 时,它只返回了 2 行(正确的行为)。即按 InvoiceID 搜索 = 718

发票编号 产品编号
718 P1
718 P2
718 P3
718 P9

我在这个 SPROC 中添加了以下部分:

在主查询中添加了列:

[FCBI].[FCBID],
[FCBI].[FCBIDCode],
[FCBI].[CBCode],

我添加了另一个外部应用部分,以从其他表中获取数据:

OUTER APPLY
    (
        SELECT
            [FCB].[FCBID],
            [FCB].[FCBIDCode],
            [LTC].[FieldText] AS [CBCode]
        FROM [dbo].[FCB] AS [FCB]
        INNER JOIN [dbo].[GenericCodes] AS [GRC] ON [GRC].[Guid] = [FCB].[CBCode]
        CROSS APPLY [dbo].[GetTranslationTable] (@LanguageCode , [GRC].[DescriptionID]) AS [LTC]
        WHERE
            [FCB].[InvoiceID] = [MT].[InvoiceID]
            AND FCB.IsSet = 0
            AND FCB.FCBJrnID = MT.FCBJrnID
    ) AS [FCBI];

在这种情况下我期望返回的内容:

发票编号 产品编号 FCBID FCBID代码 CB代码
718 P1 ABC1 abcC1 CB1
718 P2 ABC2 abcC2 CB1
718 P3 ABC3 abcC3 CB1
718 P9

但我得到的是:

发票编号 产品编号 FCBID FCBID代码 CB代码
718 P1 ABC1 abcC1 CB1
718 P2 ABC2 abcC2 CB1
718 P3 ABC3 abcC3 CB1
718 P1 DEF1 abcC4 CB1
718 P2 防御2 ABCC5 CB1
718 P3 防御3 abcC6 CB1
718 P9
4

1 回答 1

0

不管它值多少钱,如果以后任何人都会清楚,解决方案是更改 OUTER APPLY 块,如下所示:

OUTER APPLY
    (
        SELECT
            [FCB].[FCBID],
            [FCB].[FCBIDCode],
            [LTC].[FieldText] AS [CBCode]
        FROM [dbo].[FCBAP] AS [FCBAP]
        INNER JOIN [dbo].[FCB] AS [FCB] ON [FCB].[FCBID] = [FCBAP].[FCBID]
        INNER JOIN [dbo].[GenericCodes] AS [GRC] ON [GRC].[Guid] = [FCB].[CBCode]
        CROSS APPLY [dbo].[GetTranslationTable] (@LanguageCode , [GRC].[DescriptionID]) AS [LTC]
        WHERE
            [FCBAP].[ProdID] = [MT].[ProdID]
            AND [FCBAP].[TrackNumb] = [MT].[TrackNum]
            [FCB].[InvoiceID] = [MT].[InvoiceID]
            AND FCB.IsSet = 0
            AND FCB.FCBJrnID = MT.FCBJrnID
    ) AS [FCBI];
于 2021-03-11T17:19:31.577 回答