2

適切に質問する方法がわからないので、視覚化してみます。私は2つの列を持っています。1つは名前であり、名前は繰り返されます(カップルのジョンズ、いくつかのルークスなど)。他の列はほとんど言語ですが、ほんのわずかです(フランス語、スペイン語、英語など)。基本的に、一人一人が複数の言語を持つことができます。

名前が付けられているかどうかを調べようとしていますが、元の人がすべての言語に関連付けられている他の人を特定できますか?したがって、マークである例はフランス語とスペイン語を知っています。それを使って、私は他に誰がフランス語とスペイン語を知っているかを理解しようとします。したがって、ジェレミーがフランス語、スペイン語、ドイツ語を知っている場合、彼は結果に表示されます。

何か案は?

これまでのところ私は

accept nameIn prompt 'Search for:'
select name from sc16temp intersect (select lang from sc16temp where name='&nameIn');
4

1 に答える 1

1

リマインダー付きの関係分割が必要なようです。

SQL フィドル

Oracle 11g R2 スキーマのセットアップ:

create table YourTable
(
  Name varchar(10),
  Lang varchar(10),
  primary key (Name, Lang)
);

insert into YourTable values('John', 'English');
insert into YourTable values('John', 'French');
insert into YourTable values('John', 'Spanish');
insert into YourTable values('John', 'Swedish');

insert into YourTable values('Mark', 'English');
insert into YourTable values('Mark', 'French');
insert into YourTable values('Mark', 'Spanish');

insert into YourTable values('Peter', 'English');
insert into YourTable values('Peter', 'French');

クエリ 1 :

select T1.Name
from YourTable T1
  inner join YourTable T2
    on T1.Lang = T2.Lang
where T2.Name = 'Mark'
group by T1.Name
having count(T1.Lang) = (select count(Lang) 
                         from YourTable 
                         where Name = 'Mark')

結果

| NAME |
--------
| John |
| Mark |
于 2012-11-09T12:40:03.160 に答える