从两个不同的表(SQL 服务器)为视图创建列

Creating a column for a View from two different tables (SQL Server)

我在SQL服务器中有三个tableA、B和C,BC 共享来自 A 的相同外键 (AgencyID),并且它们还共享一个相同的列名:AgencyName

Table A: AgencyID, AgencyDate,

Table B: AgencyID, AgencyNumber, 机构名称

Table C: AgencyID, AgencyInvoiceNumber, 机构名称

为了帮助大家理解关系,基本上这3个table都是用Entity Framework生成的,其中BC 每个扩展 A.

现在我正尝试通过以下方式从这三个 table 创建一个视图:

CREATE VIEW [rdo].[Agencies] AS
SELECT
    A_1.AgencyID, A_1.AgencyDate,
    dbo.B.AgencyNumber, dbo.B.AgencyName,
    dbo.C.AgencyInvoiceNumber, dbo.C.AgencyName
FROM dbo.A AS A_1 LEFT OUTER JOIN
        dbo.B ON A_1.AgencyID = dbo.B.AgencyID LEFT OUTER JOIN
        dbo.C ON A_1.AgencyID = dbo.C.AgencyID

现在,显然关于 AgencyName 的脚本错误认为视图中的列名应该是唯一的 :( 我将如何解决这个问题,以便将 B 和 C 的 AgencyName 值合并到一个视图?

注意:我知道这个例子并不完美,因为可以将列移动到 table A,但这只是一个简化的例子,实际上我真的不能简单地移动列:(


B 和 C 中必须有重复列的原因:

关系如下:

            A 
           / \
          A1  A2
         /      \
        B        C

A1 和 A2 扩展 A,B 和 C 分别扩展 A1 和 A2。 AgencyName是只有B和C才有的特有属性。我知道可以在这里进行重构以尝试摆脱这种奇怪的层次结构,但是这个遗留项目已经变得太大了,我负担不起 atm 的成本。

为视图中与表中名称相同的列指定不同的名称,如下所示

CREATE VIEW [rdo].[Agencies] AS
SELECT
    A_1.AgencyID, A_1.AgencyDate,
    dbo.B.AgencyNumber, dbo.B.AgencyName AS AgencyName_B,
    dbo.C.AgencyInvoiceNumber, dbo.C.AgencyName AS AgencyName_C
FROM dbo.A AS A_1 LEFT OUTER JOIN
        dbo.B ON A_1.AgencyID = dbo.B.AgencyID LEFT OUTER JOIN
        dbo.C ON A_1.AgencyID = dbo.C.AgencyID
CREATE VIEW [rdo].[Agencies] AS
SELECT
    A_1.AgencyID, A_1.AgencyDate,
    dbo.B.AgencyNumber, dbo.B.AgencyName as AgencyNameB,
    dbo.C.AgencyInvoiceNumber, dbo.C.AgencyName as AgencyNameC,
FROM dbo.A AS A_1 LEFT OUTER JOIN
        dbo.B ON A_1.AgencyID = dbo.B.AgencyID LEFT OUTER JOIN
        dbo.C ON A_1.AgencyID = dbo.C.AgencyID

alice name 分配给 AgencyName 列。 在您的情况下, table dbo.table.AgencyName 将有一个名为 'AgencyName' 的列用于表 BC 。那就是问题所在。将 alicename 指定给任一列或两者。

尝试使用 COALESCE 来选择第一个非空的 AgencyName:

CREATE VIEW [rdo].[Agencies] AS
SELECT
    A_1.AgencyID, A_1.AgencyDate,
    dbo.B.AgencyNumber, 
    COALESCE(dbo.B.AgencyName, dbo.C.AgencyName) As AgencyName,
    dbo.C.AgencyInvoiceNumber 
FROM dbo.A AS A_1 LEFT OUTER JOIN
        dbo.B ON A_1.AgencyID = dbo.B.AgencyID LEFT OUTER JOIN
        dbo.C ON A_1.AgencyID = dbo.C.AgencyID

您可能会遇到 AgencyName 在 B 和 C 中不同的问题,在这种情况下,您需要遵循一套规则。 我的建议是仅在其中一个表中包含 AgencyName (Table A?),否则您将面临潜在的更新差异。