【问题标题】:Select values based on DISTINCT combination of rest of columns Oracle DB根据其余列 Oracle DB 的 DISTINCT 组合选择值
【发布时间】:2019-10-19 21:49:48
【问题描述】:

我想在表的其余部分中选择与不同列组合关联的行 ID。例如,如果不同的行是

我想获取与每一行关联的行 ID。我无法查询不同的 ID,因为它们是行的主键(因此都是不同的)。

到目前为止我有:

SELECT e.ID 
FROM E_UPLOAD_TEST e
INNER JOIN (
  SELECT DISTINCT WHAT, MATERIALS, ERROR_FIELD, UNITS, SEASONALITY, DATA_TYPE, DETAILS, METHODS, DATA_FORMAT 
  FROM E_UPLOAD_TEST) c
ON e.WHAT = c.WHAT AND e.MATERIALS = c.MATERIALS AND e.ERROR_FIELD = c.ERROR_FIELD AND e.DATA_TYPE = c.DATA_TYPE AND e.METHODS = c.METHODS AND e.DATA_FORMAT = c.DATA_FORMAT;  

运行但不返回任何内容。我错过了GROUP BY 和/或MIN() 声明吗?

【问题讨论】:

  • 如果您将 NULL 视为组合中的匹配值,那么您需要正确处理它。 NULL=NULL 为假。见asktom.oracle.com/pls/asktom/…
  • 你能举个例子说明你希望输出是什么吗?您不希望数据集中的哪些行使用行 ID?
  • 请阅读meta.stackoverflow.com/questions/285551/… 和接受的答案
  • 我认为这与PLSQL无关,所以我将编辑标题。
  • “我想获取行 ID”可能意味着表中某处有行 ID?或者你的意思是表存储在磁盘上时Oracle分配的ROWID?而且,你想如何获得身份证?以什么形式?输出应该是什么样子?

标签: sql oracle distinct


【解决方案1】:

@serg 是正确的。您的示例中的每一行至少有一个为空的列值。这意味着没有行会匹配您的连接条件。这就是您的查询未找到任何行的原因。

只要您的数据不经常更改,修改您的条件可能会得到您想要的结果。如果它经常更改,那么您可能需要对整个作业进行一次查询,否则您必须设置事务以使其不受数据更改的影响。

这种条件变化的一个例子是: ( ((e.WHAT 为空且 c.WHAT 为空) 或 (e.WHAT = c.WHAT))

但只有在同一列中具有空值的两行对两行意味着相同的事情并且随着时间的推移它必须意味着相同的事情时,这样的更改才有意义。 “什么是空的”今天的意思可能明天就不一样了。这可能就是 C.J. Date 如此讨厌空值的原因。

【讨论】:

  • 我将NULL 单元格更新为字符串'n/a',因为它们对表中的数据具有相同的“含义”。感谢您和 @Serg 对 NULL 的提醒。
【解决方案2】:

使用解码函数来正确比较两个 null 值,而不是比较。

e.WHAT = c.WHAT -> DECODE(e.WHAT, c.WHAT, 1) = 1

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多