通过记录类型sql为每个id拉一条记录

时间:2012-08-29 18:34:53

标签: sql

我是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。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

我想的是

SELECT Type, ID
GROUP BY Type, ID

应该有用。

答案 1 :(得分: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

你说:

  

'类型层次'的历史,地理,所有其他

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