【发布时间】: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ć 好吧,至少我们试过了。感谢您的帮助。