删除SQL结果集中重复的行



我有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有多个条目都是相同的,但"传递"…现在,如果传递给一个人的是yes和no,我只需要结果行是,如果有多个,我只需要结果行中的一个。

你知道这是怎么回事吗?

提前感谢。

既然情况不像组,下面是关于select的更详细的视图:

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,那么我需要这一行如果只有1B,那么我需要其中一行。

完整的select有39个字段。但是那些缺失的只是正常的选择,没有案例或类似的事情。

您可以利用'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;

注意:我已经将您的ANSI 89 JOIN切换到新的ANSI 92 JOIN语法。本文介绍了这样做的一些很好的理由,但这是主观的,最终的选择是你的,结果是一样的。

另一种可能更可靠的解决方案(如果您对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不会在组by中工作(除非你在组by中使用别名而不是完整的CASE语句),但是你也可以使用ROW_NUMBER()函数来实现这一点:

SELECT  *
FROM    (   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 aenderungsdatumChange_date,      
                    t.posp,
                    t.A1,
                    t.B1,
                    t.Failed,
                    t.analy,         
                    t.vect,
                    t.cover,
                    t.typ,
                    t.circ,
                    t.deadline,
                    ROW_NUMBER() OVER(PARTITION BY t.ID ORDER BY t.Passed) AS rn
            from    table_test t
                    INNER JOIN table_pers m 
                        ON m.test = t.test
        ) t
WHERE   rn = 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;

相关内容

  • 没有找到相关文章

最新更新