根据Oracle DB的其余列的DISTINCT组合选择值

时间:2017-06-30 17:42:30

标签: sql oracle distinct

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

enter image description here

我想获取与每行关联的行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()声明吗?

2 个答案:

答案 0 :(得分:1)

@serg是正确的。示例中的每一行都至少有一个为null的列值。这意味着没有行符合您的连接条件。这就是为什么您的查询不会找到任何行。

如果您的数据不经常更改,修改您的条件可能会让您获得所需的内容。如果它经常变化,那么你可能想要对整个工作进行单一查询,否则你将不得不设置你的交易以使其不受数据变化的影响。

这种情况变化的一个例子是:     ((e.WHAT为空,c.WHAT为空)或(e.WHAT = c.WHAT))

但是,只有当同一列中具有空值的两行对于两行都意味着相同的事情时,这种变化才有意义,并且它必须与时间前进相同。什么“什么是空”意味着明天可能不是同一件事。这可能就是为什么C. J. Date非常讨厌空白的原因。

答案 1 :(得分:0)

不要使用比较功能,而是使用正确比较两个 null 值的解码功能。

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