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 ごとに 1 つのレコードを作成したいと考えています。したがって、上記の例では、次のものを探しています。

History   1
Geography 2
French    3
History   4 

言い換えれば、すべての履歴レコードを提供してください。ID に履歴がない場合は地理レコードを提供し、ID のいずれでもない場合は任意のレコード タイプの 1 つを提供します。

何か案は?

ありがとう。

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 に答える