1

我是 SQL 新手,我正在尝试编写一个查询来执行以下操作。

我有一个包含记录类型和 ID 的表。每个 ID 可以有重复和多种类型。

Type              ID
History            1
History            1
Geography          1
Geography          2
French             2
French             3
English            3
English            4 
History            4
History            4

我想为每个 ID 创建一条记录,其中包含历史、地理、所有其他的“类型层次结构”。所以在上面的例子中,我正在寻找以下内容:

History   1
Geography 2
French    3
History   4 

换句话说,给我所有的历史记录,如果一个 ID 没有历史,给我地理记录,对于没有任何一个的 ID,给我任何记录类型之一。

有任何想法吗?

谢谢。

4

2 回答 2

0

我认为类似的东西

SELECT Type, ID
GROUP BY Type, ID

应该管用。

于 2012-08-29T18:39:33.830 回答
0

您没有告诉您的 RDMS,但以下代码适用于 Oracle(和 SQL Server,我想)。对于其他人,有row_number功能仿真。

--creating table..

CREATE TABLE "YOURTABLE" 
(   "TIP" VARCHAR2(20), 
"IDE" NUMBER
) 

--inserting experimental values..

insert into YOURTABLE (TIP, IDE)
values ('History', 1);
insert into YOURTABLE (TIP, IDE)
values ('History', 1);    
insert into YOURTABLE (TIP, IDE)
values ('Geography', 1);    
insert into YOURTABLE (TIP, IDE)
values ('Geography', 2);    
insert into YOURTABLE (TIP, IDE)
values ('French', 2);    
insert into YOURTABLE (TIP, IDE)
values ('French', 3);    
insert into YOURTABLE (TIP, IDE)
values ('English', 3);    
insert into YOURTABLE (TIP, IDE)
values ('English', 4);    
insert into YOURTABLE (TIP, IDE)
values ('History', 4);    
insert into YOURTABLE (TIP, IDE)
values ('History', 4);

 --code..

select m.*
      from (select *
              from YOURTABLE
             where tip = 'History'
            union
            select *
              from YOURTABLE
             where tip = 'Geography'
               and ide not in (select ide from YOURTABLE where tip = 'History')
            union
            select tip, ide
              from (select s.*,
                           ROW_NUMBER() OVER(PARTITION BY ide ORDER BY ide) ord
                      from YOURTABLE s
                     where tip not in ('History', 'Geography')
                       and ide not in
                           (select ide
                              from YOURTABLE
                             where tip in ('History', 'Geography')))
             where ord = 1) m

结果表:

TIP                         IDE
-------------------- ----------
History                       1
Geography                     2
English                       3
History                       4

你说:

历史、地理和所有其他的“类型层次结构”

在我的示例中,结果是英语而不是法语,但这不应该成为问题,因为“所有其他人”都是平等的。

于 2012-08-29T21:57:56.613 回答