0

我正在尝试在 SQL Server 2008 R2 中创建一个视图,其中数据是从具有双重一对一关系的两个表中提取的,并且我想在其中一个中的单个列中创建基于视图的值中的两列表。

这些表目前类似于以下示例:

表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' 比区分 'ValueA' 和'价值B')。

应该决定哪些值进入“值”列或“数字”列的因素是 TableB 中的 PrimaryKey 及其在 TableA 中的任一外键中的引用(但两个 FK 绝不应引用相同的键)。

这可能不是最出色的数据库模型,在表之间具有双重关系。然而,这是由于使用 ADO.NET Entity Framework 将一些 C#.NET 类映射到数据库,其中 A 类有 B 类的两个对象(在本例中名为“值”和“数字”),以及当前的数据库模型因此构建了两个关系。改变这不是一种选择。

我试过用谷歌搜索这个,但我发现很难找到我需要的答案。尤其是当大多数结果正好相反时:将多列选择为一列。

那么,我应该如何编写 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

现在,有什么建议可以填写查询吗?

4

2 回答 2

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 样式的连接。这些几乎总是比旧样式更受欢迎(FROM子句中的表格只是用逗号分隔)


如果其中的某些行可能TableANULL Value_FKor Number_FK,并且您仍然希望这些行出现在您的视图中,您可以将其中一个或两个inner joins 切换为left joins。然后,您还将决定输出列是应该是NULL(在这种情况下您已经完成)还是其他一些值(在这种情况下,您将拥有 eg COALESCE(b1.Value,<Value when null>) as 'Value')。

于 2013-06-26T13:49:34.117 回答
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

你的查询过于复杂了。

于 2013-06-26T13:50:36.063 回答