【问题标题】:sql distinct on multiple cols but not all the columnssql 在多个列上不同,但不是所有列
【发布时间】:2012-01-19 22:41:18
【问题描述】:

我正在尝试编写一个合并查询来从表 A 中读取一些数据并合并到表 B 中。

从 A 读取时,我想确保行基于几列是不同的。所以我有一个类似的查询:

从 A 中选择不同的 col1、col2、col3。 但是我希望唯一性在 (col1,col2) 对上。上面的查询仍然会得到对 (col1,col2,col3) 唯一但对 (col1,col2) 唯一的行

有没有其他方法可以实现这一点或使用类似的东西 select distinct(col1,col2),col3 from A.

另外, 我预计 A 会有很多记录 ~10-20 百万。此外,我计划迭代多个这样的表 A [它本身是通过几个连接动态生成的]。希望该解决方案的性能不会更差,但无论哪种情况,我都在寻找一种首先有效的解决方案,然后我可能会部分运行查询。

Oracle 10G 是版本。

谢谢!

更新:我想知道 groupby 是否会调用排序操作,而这会比使用 distinct 更昂贵?

更新:回答以下问题之一:对于 (A, B, C) 和 (A, B, D) 行,您的预期结果是什么? => 假设我想在 (A,B) 上有所不同,返回 (A,B,C) 或 (A,B,D) 中的任何一个都可以,但不能同时返回。

【问题讨论】:

  • 我不太明白你想要得到什么。如果您有 (A, B, C) 和 (A, B, D),您的查询应该返回哪一行?还是只希望它返回 (col1, col2) 唯一的情况?
  • 不会对所有 3 列 col1、col2、col3 进行分组
  • 请回复@eaolson,以便为您提供解决方案。对于 (A, B, C) 和 (A, B, D) 行,您的预期结果是什么?
  • @danihp .. 我已经回答了你的问题。感谢您的帮助
  • 那么,@michalpowaga 的回答是对的。

标签: sql oracle join plsql


【解决方案1】:

如果col3 中有多个不同的值用于特定对(col1col2),您必须选择其中一个我在此处使用过的max(但您可以使用任何那些Aggregate Functions (Oracle)):

select col1, col2, max(col3) 
from A 
group by col1, col2

【讨论】:

  • 我不想要,max(col3) .. 基本上这个选择将用于“插入差异表”.. 所以 max(col3) 是不可接受的.. 我想要行 =>不同(col1,col2),col3
  • @codeObserver,您写道“假设我想要在 (A,B) 上不同,返回 (A,B,C) 或 (A,B,D) 中的任何一个都可以,但不能同时返回。 "听起来你得到CDmax确保这一点)并不重要,现在你说它确实如此。所以请解释一下它背后的规则(一定有什么)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多