从减号表中获取不同的场景
Posted
技术标签:
【中文标题】从减号表中获取不同的场景【英文标题】:Getting different scenarios from minus table 【发布时间】:2012-06-11 00:08:55 【问题描述】:我有这两张桌子:
表 A
ID 类型 SDATE EDATE 评级 1 M 2010 年 1 月 1 日 2011 年 1 月 1 日 1 M 2010 年 1 月 3 日 2011 年 1 月 4 日 B 2 A 2010 年 7 月 2 日 2015 年 1 月 31 日 C 3 M 2011 年 3 月 1 日 2012 年 1 月 20 日 B 4 A 2011 年 3 月 1 日 2012 年 1 月 20 日 B 5 M 2009 年 3 月 1 日 2009 年 3 月 1 日 6 M 2006 年 12 月 31 日 9999 年 12 月 31 日 7 A 2006 年 1 月 1 日 9999 年 12 月 31 日 B表 B
ID 类型 SDATE EDATE 评级 1 M 2010 年 1 月 1 日 2011 年 1 月 1 日 2 A 2010 年 7 月 2 日 2015 年 1 月 31 日 C 2 A 2010 年 9 月 2 日 2015 年 1 月 31 日 C 3 M 2011 年 3 月 1 日 2012 年 1 月 20 日 B 4 A 2011 年 3 月 1 日 2012 年 1 月 20 日 C 6 M 2006 年 12 月 31 日 2015 年 12 月 31 日 7 A 2006 年 2 月 1 日 9999 年 12 月 31 日 B 8 M 2010 年 1 月 2 日 2012 年 1 月 2 日当我执行表 A 减去表 B 时,它会得到下一个结果:
ID 类型 SDATE EDATE 评级 1 M 2010 年 1 月 3 日 2011 年 1 月 4 日 B 4 A 2011 年 3 月 1 日 2012 年 1 月 20 日 B 5 M 2009 年 3 月 1 日 2009 年 3 月 1 日 6 M 2006 年 12 月 31 日 9999 年 12 月 31 日 7 A 2006 年 1 月 1 日 9999 年 12 月 31 日 B我已经确定了 A.id 不在 B.id 中的情况,但是如何检查它何时在其他列中有所不同?
我不允许在架构上创建任何东西,所以我必须通过查询来完成。
到目前为止,这就是我所拥有的,但它给我的数据不正确。
with aminusb as
(
select
*
from A
minus
select
*
from B
)
select
diff.*
from
aminusb diff
,B
where
diff.id = B.id
and
diff.start_date = B.start_date
and
diff.end_date = B.end_date
and
diff.rating <> B.rating
你知道我怎样才能得到不同的场景吗?
当一切都一样时,评分。 当一切都一样时,结束日期。 当没有什么是相等的但它具有相同的 id。我需要获取满足每个场景的记录列表,以便人们可以详细检查它。
谢谢。
【问题讨论】:
您可以尝试unpivoting A-B 和 B-A,将结果加入 ID 和 ColumnName 并过滤掉具有相同值的结果。之后,您将获得按列列出的差异列表。 @NikolaMarkovinović 嗨,我试过这样的东西,但它似乎不适用于 oracle 10g。with aminusb as ( SELECT * FROM A MINUS SELECT * FROM B ) select diff from aminusb diff,B where diff.id = B.id and diff.start_date = B.start_date and diff.end_date = B.end_date and diff.rating <> B.rating unpivot ( rating_cd for as in ( SELECT DISTINCT (id) FROM A ) )
那是哪个版本的 Oracle?
@NikolaMarkovinović Oracle 10g
@NikolaMarkovinović 好吧,至少我们试过了。感谢您的帮助。
【参考方案1】:
这会给出不常见的行:
Select startdate, enddate, rating
from TableA
Intersect
Select startdate, enddate, rating
from TableB
显示所有记录:
Select TableA.startdate, TableA.enddate, TableA.rating
from TableA
UNION
Select startdate, enddate, rating
from TableB
案例一:
Select TableA.*, TableB.*
from tableA,TableB
Where TableA.StartDate = tableB.StartDate
And tableA.Enddate=TableB.Enddate
And TableA.Rating <>TableB.Rating
和 TableA.Rating = TableB.Rating
案例 2:
Select TableA.*, TableB.*
from tableA,TableB
Where TableA.StartDate = tableB.StartDate
And tableA.Enddate<>TableB.Enddate
And TableA.Rating = TableB.Rating
案例 3:
Select TableA.*, TableB.*
from tableA,TableB
Where TableA.StartDate <> tableB.StartDate
And tableA.Enddate<>TableB.Enddate
And TableA.Rating <>TableB.Rating
And TableA.ID =TableB.ID
【讨论】:
@Jeffrey-Kemp 嗨,我尝试了您提出的解决方案,但我意识到存在重复值并且 id 不是唯一的。当我尝试使用减号的表格时,我得到了 1400 个差异,而您给我的代码则超过了 5000。对不起。 @StrayChild01,为了清楚起见,我只是编辑了答案。这是海军的解决方案。 @Naval 您好 Naval,我尝试了您的解决方案,但无法获得所需的内容。请参阅我对它的第一条评论。 @StrayChild01 您尝试了哪些案例? @Naval Hi Naval,抱歉回答迟了。问题是其中一张表实际上是一个视图,每次我运行它时,它都会给我不同的结果。我不得不追查整个事情,但查询是正确的。谢谢。以上是关于从减号表中获取不同的场景的主要内容,如果未能解决你的问题,请参考以下文章