3

私には従業員がいて、彼らが好きな果物を知っているとしましょう。

fruits(name, fruit_name)

私の質問は、少なくともドナルドと同じ果物が好きなすべての従業員をリストすることです.

では、2 つの値のセットを比較するにはどうすればよいでしょうか。

これは、ドナルドが好きな果物を取得する方法です。

Select name, fruit_name
from fruits
where initcap(name) like '%Donald%';

例:ドナルドはリンゴ、ナシ、モモが好きです。リンゴ、ナシ、モモ、そしておそらく他の果物が好きな人が必要ですが、彼らはそれらの3つが好きでなければなりません.

4

6 に答える 6

1

自己結合を使用して目的の結果を得ることができます-出力を得るためにクエリを少し調整しました-

select distinct e1.name from fruits e1,(Select name, fruit_name
from fruits
where initcap(name) like '%Donald%') e2
where e1.fruit_name = e2.fruit_name;

上記のクエリは、少なくとも 1 つの果物が Donald と一致する従業員を返します

以下でテストされたクエリは、少なくともすべてのドナルドの果物が一致する従業員を提供します

     select name from (
    select name,count(1) cnt  from
    (select name,fruit_name, case when fruit_name in (Select distinct fruit_name
        from fruits
        where initcap(name) like '%Donald%') then 1 else 0 end fruit_match from fruits)
    where fruit_match = 1 group by name) where  cnt >=
 (select count(distinct fruit_name) from fruits where initcap(name) like '%Donald%');
于 2013-11-06T09:22:19.463 に答える
0

これを試して:

Select distinct f2.name 
from fruits f1, fruits f2 where f1.fruit_name = f2_fruit_name 
where initcap(f1.name) like '%Donald%';
于 2013-11-06T10:02:42.390 に答える
0

Oracle plsqlでは、次のようなものを使用して、ドナルドが好きなすべての果物が好きなすべての従業員を出力します。

declare 
emp_name fruits.name%type;

begin

for rec in select distinct name from fruits
 loop

select name into emp_name from
(
 Select name, fruit_name
  from fruits
   where fruits.name=rec.name
 minus
   Select name, fruit_name
  from fruits
 where initcap(name) like '%Donald%'
)

if emp_name is null
 then
 dbms_output.put_line('Employee' || rec.name || 'likes same fruits as Donald');
end if

 end loop 

end
于 2013-11-06T09:43:42.103 に答える