从减号表中获取不同的场景

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 &lt;&gt; 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,抱歉回答迟了。问题是其中一张表实际上是一个视图,每次我运行它时,它都会给我不同的结果。我不得不追查整个事情,但查询是正确的。谢谢。

以上是关于从减号表中获取不同的场景的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sql从具有不同列的两个表中获取不同的记录

通过 id 从一个表中获取数据并显示在不同的不同页面中

创建 pl/sql 过程以从不同的表中获取不同的列

Linq 查询从两个表中获取不同的记录

Laravel - 从不同的表中获取总和并计算

从 laravel 的不同表中获取每个 id 的总数