从两个不同的表(SQL 服务器)为视图创建列
Creating a column for a View from two different tables (SQL Server)
我在SQL服务器中有三个tableA、B和C,B和C 共享来自 A 的相同外键 (AgencyID
),并且它们还共享一个相同的列名:AgencyName
Table A: AgencyID
, AgencyDate
,
Table B: AgencyID
, AgencyNumber
, 机构名称
Table C: AgencyID
, AgencyInvoiceNumber
, 机构名称
为了帮助大家理解关系,基本上这3个table都是用Entity Framework生成的,其中B
和C
每个扩展 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' 的列用于表 B
和 C
。那就是问题所在。将 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?),否则您将面临潜在的更新差异。
我在SQL服务器中有三个tableA、B和C,B和C 共享来自 A 的相同外键 (AgencyID
),并且它们还共享一个相同的列名:AgencyName
Table A: AgencyID
, AgencyDate
,
Table B: AgencyID
, AgencyNumber
, 机构名称
Table C: AgencyID
, AgencyInvoiceNumber
, 机构名称
为了帮助大家理解关系,基本上这3个table都是用Entity Framework生成的,其中B
和C
每个扩展 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' 的列用于表 B
和 C
。那就是问题所在。将 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?),否则您将面临潜在的更新差异。