2

3 つの Oracle データベース テーブルがあります。少し簡単にするために、不自然な例を作成します。

獣医師のテーブル..

vid         name
1           Bob
2           Sally
3           Sue
4           Henry

特産品

spid    Animal

1       Dogs
2       Cats
3       Mice
4       Kangaroos
5       Koala Bears

広告

id     vid   spid               Ad venue

1       1      1                 TV ads
2       1      2                 TV ads
3       1      2                 Magazine ads
4       2      1                 TV ads
5       2      1                 On line ads
6       3      5                 TV ads
7       4      5                 Magazine ads

専門分野ごとに、1 つの専門分野のみを宣伝する最初の 3 人の獣医の結果セットを取得したいと考えています。一部の専門分野については、獣医がその専門分野を宣伝していない可能性があります。「vets」テーブルには約 30,000 行あります。Specialties テーブルには 10 行しかありません。広告テーブルには約 100,000 行あります。クエリと結合の方法は知っていますが、グループ内ですべて同じ行を見つける方法がわかりません。

だから私はこのような出力を探しています:

 Dogs          null
 Cats          Sally
 Mice          null
 Kangaroos     null
 Koala Bears   Sue, Henry
4

3 に答える 3

2
select
   max(animal) as animal,
   listagg(name, ', ') within group (order by name) as vet_list
from
   Specialties
   left join (
      select
         vid,
         max(spid) as spid,
         row_number() over(partition by max(spid) order by null) rn
      from Advertising
      group by vid
      having count(distinct spid) = 1
   ) using(spid)
   left join veterinarians using(vid)
where lnnvl(rn > 3)
group by spid
order by spid

フィドル

于 2013-03-04T08:11:53.267 に答える
1

これにより、1つの専門分野のみを宣伝する獣医が得られます

SELECT vid
FROM advertising
GROUP BY vid
HAVING COUNT(*)=1

これにより、各カテゴリに 1 つの専門分野を持つすべての獣医が表示されます

SELECT s.Animal, v.name
FROM Specialties s
     LEFT JOIN
     advertising a ON s.spid=a.spid
     LEFT JOIN
     veterinarians v ON a.vid=v.vid
WHERE a.vid IN (SELECT vid
                FROM advertising
                GROUP BY vid
                HAVING COUNT(*)=1)

さて、このコンテキストで「最初」が何を意味するかを指定していません-アルファベット順、ID順、または別の何か? と決めたら、これで仕切ることができます。

于 2013-03-04T02:25:21.593 に答える
0

以下を試してください:-

select vid
from (select distinct vid, spid
from advertising)
group by vid
having count(*) = 1;

上記は、専門分野が 1 つしかないすべての獣医のリストを示します。対応する専門分野のリストを取得するには、次のコマンドを実行します:-

select * from
(select s.spid,s.animal, a.vid,v.name,row_number() over (partition by s.spid order by a.vid) rn
from specialities s inner join advertising a
on s.spid=a.spid
inner join vets v
on a.vid=v.vid
and v.vid in (select vid
    from (select distinct vid, spid
    from advertising)
    group by vid
    having count(*) = 1)
order by s.spid
)
where rn <= 3;

上記は、null出力を持つべき専門分野を示していません(あなたの例によると)。そのリストも取得するには、最後の内部結合を左外部結合に変換します。

于 2013-03-04T03:46:15.477 に答える