选择基于ROWID - Distinct或Group By在oracle中不起作用

时间:2014-01-06 05:58:59

标签: c# sql oracle plsql logic

我有如下查询,我尝试使用Group BY过滤掉重复的列

SELECT contacts.rowid      AS ROW_PASS, 
       duty_rota.rowid     AS ROW_PASS_ROTA, 
       duty_rota.duty_type AS DUTY_TYPE 
FROM   duty_rota, 
       duty_types, 
       contacts 
WHERE  duty_rota.duty_type = duty_types.duty_type 
       AND duty_rota.duty_officer = contacts.duty_id 
       AND sname IS NOT NULL 
GROUP  BY contacts.rowid, 
          duty_rota.rowid, 
          duty_rota.duty_type 
ORDER  BY duty_date 

在稍微使用查询后,我发现在使用ROWID时我们无法过滤掉使用group by。那么有人可以帮我用

的逻辑编写代码(在SQL中)
if (any row is completely identical with another row of the query o/p)
{
then display only one column
}

我将在C#中将输出用作gridview的数据源,所以如果不是在SQL中 - 你能否帮助我在C#中以某种方式实现只显示相同的列?

3 个答案:

答案 0 :(得分:1)

如果要过滤重复的行,可以使用此查询:

SELECT Max(duty_rota.rowid) AS ROW_PASS_ROTA, 
       duty_rota.duty_type  AS DUTY_TYPE 
FROM   duty_rota, 
       duty_types, 
       contacts 
WHERE  duty_rota.duty_type = duty_types.duty_type 
       AND duty_rota.duty_officer = contacts.duty_id 
       AND sname IS NOT NULL 
GROUP  BY duty_rota.duty_type 
ORDER  BY DUTY_TYPE 

答案 1 :(得分:0)

您可以: http://sqlfiddle.com/#!2/2a038/2

取出ROWID。示例:如果您的表有3列(colA,colB,colC),您可以通过这种方式找到确切的行重复...

select a.* from
(
select count(*) dupCnt, colA, colB, colC from myTable
group by colA, colB, colC
) a
where dupCnt > 1

答案 2 :(得分:0)

首先,ROWID是每行的唯一字段,因此使用此字段您将永远不会有重复项。这里唯一的解决方案是使用它。无论如何,它的数据都无法显示任何内容。

简单地说,如果您不想重复,则需要DISTINCT关键字:

SELECT DISTINCT field1, 
                field2 
FROM   table1, 
       table2 
WHERE  table1.key1 = table2.key1; 

这将从两个表中选择所有Field1,Field2组合。由于DISTINCT关键字,每行只会在结果列表中一次。重复项不在结果列表中。

SELECT DISTINCT duty_rota.duty_type AS DUTY_TYPE 
FROM   duty_rota, 
       duty_types, 
       contacts 
WHERE  duty_rota.duty_type = duty_types.duty_type 
       AND duty_rota.duty_officer = contacts.duty_id 
       AND sname IS NOT NULL 
ORDER  BY duty_date 

如果您需要对结果集进行进一步操作,则只需要GROUP BY,例如计算重复项。如果你只需要“没有重复”,DISTINCT关键字正是你想要的。

修改

如果我误读了您的问题并且您只想查看那些 重复项,那么您需要进行分组,并且需要根据标准进行过滤。您可以使用HAVING子句执行此操作。这是组标准的另外WHERE

SELECT FIELD1, FIELD2, COUNT(*)
  FROM TABLE1, TABLE2
 WHERE TABLE1.KEY1 = TABLE2.KEY1
 GROUPB BY FIELD1, FIELD2
HAVING COUNT(*) > 1