摆脱SQL结果集中的重复行

时间:2013-06-18 07:35:08

标签: sql select db2 resultset

我有2个表,用于从

获取结果集
select 
a.id,
a.test,
a.score,
b.name,
b.person,
b.grade
from table_test a, table_pers b 
where a.test=b.test 

现在的问题是表b有多个条目,它们都是相同的但是“传递”...现在如果传递是肯定而不是1个人我只需要是结果行而只需要那个我需要的如果有多个,则为no行且仅为onw。

关于如何运作的任何想法?

提前致谢。

好的,因为案例不喜欢这里的小组是关于选择的更详细的观点:

select
t.id,
t.tests test,
t.lang,
m.title_TEXT Titel, 
m.Sched Schedual,
m.prof profs, 
m.date_out Date,
m.sub subject,
m.chan Changes, 
case
when m.cha2 = ''
then m.cha1
else m.cha2
end as last_change,
case
when m.datac2 = ''
then m.datac1
else m.datac2
end as Change_date,         
t.posp,
t.A1,
t.B1,
t.Failed,
t.analy,         
t.vect,
t.cover,
t.typ,
t.circ,
t.deadline
from table_test t, table_pers m where m.test=t.test

我在t.passed中看到的值是'1A'和'1B' 如果有一个1A然后我需要那行如果tehre只有1B然后我需要其中一行。

完整选择有39个字段..但缺少的只是正常选择没有案例或类似的事情。

2 个答案:

答案 0 :(得分:1)

您可以利用'Yes' > 'No'这一事实,因此您可以使用:

select  a.id,
        a.test,
        a.score,
        b.name,
        b.person,
        b.grade,
        MAX(Passed) AS Passed
from    table_test a
        INNER JOIN table_pers b 
            ON a.test = b.test
GROUP BY a.id, a.test, a.score, b.name, b.person, b.grade;

N.B。我已将ANSI 89 JOIN切换为新的ANSI 92 JOIN语法。 This article涵盖了这样做的一些很好的理由,但它是主观的,而且选择最终是你的,结果是相同的。

替代的,可能更多的rubust解决方案(如果passed有其他不同的允许值)将是:

select  a.id,
        a.test,
        a.score,
        b.name,
        b.person,
        b.grade,
        CASE WHEN COUNT(CASE WHEN Passed = 'Yes' THEN 1 END) > 0 THEN 'Yes' ELSE 'No' END AS Passed
from    table_test a
        INNER JOIN table_pers b 
            ON a.test = b.test
GROUP BY a.id, a.test, a.score, b.name, b.person, b.grade;

修改

我没有理由知道CASE在组中不起作用(除非你在组中使用别名而不是完整的case语句),但是你也可以使用{{1功能:

ROW_NUMBER()

答案 1 :(得分:1)

select  a.id,
        a.test,
        a.score,
        b.name,
        b.person,
        b.grade,
        Passed
from    table_test a
        INNER JOIN table_pers b 
            ON a.test = b.test
    where qualify row_number() over (partition by a.id order by passed desc)=1;