我有如下查询,我尝试使用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#中以某种方式实现只显示相同的列?
答案 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