2017-07-31 37 views
0

我有两个不同的表,它们包含两组不同的报表数据。然而我想要一个UNION ALL视图,这样我就可以将公共列一起显示出来。我第一次尝试制作一个单独的列:导入Oracle UNION ALL查看到实体框架EDMX

SELECT NVL(ROW_NUMBER() OVER (ORDER BY REPORT_PERIOD DESC, REPORT_ID DESC),0) ROW_ID,u.REPORT_ID,u."REPORT_PERIOD",u."EXCEL_DOC",u."XML_DOC",u."STATUS",u."CREATED_BY",u."CREATED_ON",u."MODIFIED_BY",u."MODIFIED_ON" 
FROM 
(
    SELECT ('DR' || TO_CHAR(DISTRIBUTION_REPORT_ID)) AS REPORT_ID, 
     REPORT_PERIOD, 
     EXCEL_DOC, 
     XML_DOC, 
     STATUS, 
     CREATED_BY, 
     CREATED_ON, 
     MODIFIED_BY, 
     MODIFIED_ON 
    FROM DISTRIBUTION_REPORT 

    UNION ALL 

    SELECT ('TR' || TO_CHAR(TREATMENT_REPORT_ID)) AS REPORT_ID, 
     REPORT_PERIOD, 
     EXCEL_DOC, 
     XML_DOC, 
     STATUS, 
     CREATED_BY, 
     CREATED_ON, 
     MODIFIED_BY, 
     MODIFIED_ON 
    FROM TREATMENT_REPORT 
) u 

的Visual Studio不会让我补充一点,因为它无法推断主键。于是我增加了一个:

ALTER VIEW VW_ALL_REPORT ADD CONSTRAINT VW_ALL_REPORT_PK PRIMARY KEY (ROW_ID) DISABLE 

然后我得到了一个错误,指出关键的所有部分必须是非空的。然后我尝试添加一个rownumber()列并尝试相同的事情,并得到相同的确切错误。

在每种情况下,Oracle似乎认为关键字列是可以空的,即使它不应该是半智能的。所以它将这种不准确传递给Visual Studio。

如果您双击视图,您将获得每列的属性。请注意“可空=是”

enter image description here

我知道我可以添加一个名为“ALL_REPORT”第三个表,并可能只是其他两个表中添加行的每一行。但是,这看起来像是浪费资源。有任何想法吗?


我使用VS 2013,Oracle 11g和VB.NET。


+0

我通过创建临时表,然后在导入到EF之前更改我的视图,然后将其切换回来,从而跟踪此人的解决方法。但是,这个解决方法的男孩很臭:https://community.oracle.com/thread/2256196?start=0&tstart=0 –

+0

我也试过用这个合并版本替换我的union的所有查询的方法。 Oracle仍然报告该列是可空的。 Uggh! https://stackoverflow.com/questions/22531774/oracle-sql-alternative-to-the-union-all-statement –

+0

更新的问题添加row_number(),仍然显示为可空。 –

回答

0

我不知道创建一个视图时会有什么可空性。

在另一方面,这个代码不应该在甲骨文工作:

SELECT ('DR' + TO_CHAR(DISTRIBUTION_REPORT_ID)) AS REPORT_ID, 

正确的提法是:

SELECT ('DR' || TO_CHAR(DISTRIBUTION_REPORT_ID)) AS REPORT_ID, 

+是一个算术运算符不上串很好地工作。

+0

这对Nullability没有影响。 –