SQL从一个表列中在View中创建多个列

时间:2013-06-26 13:46:10

标签: sql sql-server-2008 database-design view

我正在尝试在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

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

2 个答案:

答案 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_FKNumber_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

你的查询过于复杂。