我在SQL Server中有三个表A,B和C, B 和 C 从共享相同的外键(AgencyID
)一个,它们也共享一个相同的列名:AgencyName
表 A :AgencyID
,AgencyDate
,
表 B :AgencyID
,AgencyNumber
, AgencyName
表 C :AgencyID
,AgencyInvoiceNumber
, AgencyName
为了帮助您了解这种关系,基本上这3个表是使用实体框架生成的,其中B
和C
各自扩展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才有。我知道可以在这里进行重构以试图摆脱这种奇怪的层次结构,但是这个遗留项目已经变得太大了,我承担不起成本的限制。
答案 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”的列,用于表格B
和C
。那就是问题所在。给这一列中的任何一个或两者都提供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?),否则您将面临潜在的更新差异。