使用Full Outer Join查看以生成用于EF的非空列

时间:2014-12-10 22:14:45

标签: c# sql-server entity-framework tsql join

我正在努力创建一个视图,该视图使用完整的外连接,然后使用左外连接来连接它。视图生成我想要的结果,但我们首先使用EF6数据库将DB对象拉入.net MVC应用程序。有了这个,我们必须在视图中至少有一个列是非null唯一的,以允许ef创建推断的主键。我之后尝试添加它,但无法绕过它,因为SQL中带有完整外连接的视图必须允许空值。

我也尝试过union和union,但这会产生重复。我想要非空的唯一值。

例如。让我们说TableA,TableB和TableC都具有相同的主键。所有表都有不同的列(这就是union all生成重复的原因)。我希望合并后的合并结果。

Select 
 c.guid
 ,a.something
 ,b.something
 ,c.something
 ,etc
FROM (TableA as a Full Outer Join TableB as b on a.guid = b.guid) LEFT OUTER JOIN
      TableC as c on c.guid = a.guid OR c.guid = b.guid

我还首先尝试使用TableC进行右外连接,但结果相同。

提前致谢

3 个答案:

答案 0 :(得分:1)

尝试...

Select Coalesce(a.guid, b.guid, c.guid) As guid,
       (the rest of your query here)

答案 1 :(得分:0)

从字面上看,它应该是这样的:

...
left join dbo.TableC c on c.guid = isnull(a.guid, b.guid)

另一方面,由于C实际上是A和B的超类型,因此连接顺序应相反:

select c.guid, ...
from dbo.TableC c
  left join dbo.TableA a on a.guid = c.guid
  left join dbo.TableB b on b.guid = c.guid
where isnull(a.guid, b.guid) is not null
...

你应该从一开始就提到这种情况。

答案 2 :(得分:0)

如果它是一个泛化模型,这不会起作用吗?由于c总是存在,当a是-a c OR b是-a c。

select 
    c.guid, ISNULL(a.guid, 'N/A'), ISNULL(b.guid, 'N/A'), *
FROM
    TableC c
    INNER JOIN TableA a ON c.guid = a.guid
    INNER JOIN TableB b ON c.guid = b.guid