我正在尝试在SQL Server 2008 R2中创建一个View,其中数据是从具有双重一对一关系的两个表中提取的,我想在基于视图的两个列中创建两个列。其中一个表。
这些表目前与这些例子类似:
表A:
PrimaryKey | Name | Value_FK | Number_FK
-------------------------------------------
66 | NameA | 1 | 2
77 | NameB | 3 | 4
表B:
PrimaryKey | Value
-------------------
1 | 238
2 | 456
3 | 100
4 | 200
视图应如下所示:
Name | Value | Number
-------------------------
NameA | 238 | 456
NameB | 100 | 200
('Value'和'Number'基本上是相同的类型,并且都在TableB的'Value'列中找到。我认为在'Value'和'Number'之间进行distingiush更容易,而不是' ValueA'和'ValueB')。
应该决定哪些值进入列'值'或列'数'的因素是TableB中的PrimaryKey及其在TableA中的任一外键中的引用(但两个FK都不应该引用相同的键)。
这可能不是最出色的数据库模型,在表之间具有双重关系。这是因为使用ADO.NET实体框架将一些C#.NET类映射到数据库,其中类A有两个B类对象(在本例中名为“Value”和“Number”),以及当前的数据库模型由此构建两个关系。改变这一点不是一种选择。
我试过谷歌搜索,但我发现很难找到我需要的答案。特别是当大多数结果恰好相反时:在一列中选择多个列。
那么,我该如何编写Select语句?
CREATE VIEW ViewName
AS
SELECT DISTINCT a.Name as 'Name', ????? as 'Value', ????? as 'Number'
FROM TableA a, TableB b
我对高级SQL命令很生疏。自从我上次进入这个先进的东西以来已经超过了1。5年。我尝试过第一次类似的事情:
CREATE VIEW ViewName
AS
WITH Name AS
( SELECT DISTINCT a.Name FROM TableA a )
Value AS
(
SELECT DISTINCT b.Value as 'Value' FROM TableA a, TableB b
WHERE b.PrimaryKey = an.ValueA_FK
),
Number AS
(
SELECT DISTINCT b.Value as 'Number'
FROM TableA a, TableB b
WHERE a.PrimaryKey = an.ValueB_PrimaryKey
)
SELECT DISTINCT
* FROM Name, Value, Number
我完全失败的尝试的结果是这样的:
Name | Value | Number
-------------------------
NameA | 100 | 200
NameB | 100 | 200
NameA | 100 | 456
NameB | 100 | 456
NameA | 238 | 200
NameB | 238 | 200
NameA | 238 | 456
NameB | 238 | 456
现在,有什么建议可以填写查询吗?
答案 0 :(得分:4)
您可以在FROM
子句中多次引用同一个表:
SELECT a.Name as 'Name', b1.Value as 'Value', b2.Value as 'Number'
FROM TableA a
inner join TableB b1
on
a.Value_FK = b1.PrimaryKey
inner join TableB b2
on
a.Number_FK = b2.PrimaryKey
我还删除了DISTINCT
,因为它不应该是你添加一个的习惯,而且问题中没有任何内容表明一个是必要的。我也使用过ANSI-Style连接。这些几乎总是比旧样式更受欢迎(FROM
子句中的表只用逗号分隔)
如果TableA
中的某些行可能有NULL
Value_FK
或Number_FK
,并且您仍然希望在视图中显示这些行,则可以切换一个或两个inner join
的{{1}}为left join
。然后,您还将决定输出列是NULL
(在这种情况下,您已完成)还是其他一些值(在这种情况下,您将拥有例如COALESCE(b1.Value,<Value when null>) as 'Value'
)。
答案 1 :(得分:0)
此查询将产生您想要的结果:
select t1.Name, value.Value, number.Value as Number
from TableA t1
inner join TableB value on value.PrimaryKey = t1.Value_FK
inner join TableB number on number.PrimaryKey = t1.Number_FK
你的查询过于复杂。