我是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。
有什么想法吗?
感谢。
答案 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
你说:
'类型层次'的历史,地理,所有其他
在我的例子中,英语进入了结果,而不是法语,但这不应该是一个问题,因为“所有其他人”都是平等的。