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

本文关键字:Server SQL 视图 创建 两个 | 更新日期: 2023-09-27 17:56:28

我在SQL Server中有三个表A,B和C,BC共享来自A的相同外键(AgencyID),并且它们也共享一个相同的列名:AgencyName

AAgencyIDAgencyDate

BAgencyIDAgencyNumber机构名称

CAgencyIDAgencyInvoiceNumber机构名称

为了帮助您理解这种关系,基本上这 3 个表是使用实体框架生成的,其中 BC 分别扩展A

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

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值合并到一个视图中?

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


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

以下是关系:

            A 
           / '
          A1  A2
         /      '
        B        C

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

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

尝试使用 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

您可能会遇到 B&C 中 AgencyName 不同的问题,在这种情况下,您将需要遵循一组规则。我的建议是只在其中一个表中使用机构名称(表 A?),否则您将面临潜在的更新差异。

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

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列。在您的情况下,表dbo.table.AgencyName将有一个名为"机构名称"的列,用于表BC。这就是问题所在。为任一列或两者指定 alicename。