从两个不同的表(SQL Server)

时间:2016-07-11 04:32:05

标签: c# sql sql-server left-join

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

A AgencyIDAgencyDate

B AgencyIDAgencyNumber AgencyName

C AgencyIDAgencyInvoiceNumber AgencyName

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

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

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才有。我知道可以在这里进行重构以试图摆脱这种奇怪的层次结构,但是这个遗留项目已经变得太大了,我承担不起成本的限制。

3 个答案:

答案 0 :(得分:1)

为视图中名称相同的列提供不同的名称,如下所示

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

答案 1 :(得分:1)

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将有一个名为“AgencyName”的列,用于表格BC。那就是问题所在。给这一列中的任何一个或两者都提供alicename。

答案 2 :(得分:1)

尝试使用COALESCE选择第一个非null 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?),否则您将面临潜在的更新差异。