3

これは私が答えようとしている質問です:

私が持っているものは次のとおりです。

SELECT DISTINCT a1.acnum
FROM academic a1, academic a2
WHERE a1.deptnum = a2.deptnum
AND a1.acnum <> a2.acnum
AND a1.acnum IN (Select acnum
from interest
group by acnum
having count(acnum) >1);

これは間違っています。なぜなら、acnum (アカデミック番号) 218 が acnum 217 と同じ部門で働いていて、かつ acnum 199 (diff 部門) と同じ興味を持っている場合、acnum 218 をリストに追加するからです。

ただし、acnum 218 と 217 の両方が同じ量の分野の関心を持っている場合にのみ追加する必要があります。

Interest テーブルには fieldnum 、acnum があります

アカデミック テーブルには、acnum、deptnum、name があります

部門テーブルには deptnum、deptName があります

 FIELDNUM           ACNUM DESCRIP                                                                        
------------------ -------------------- 
292                 100  Multiprocessor and Special purpose computer design                               
293                 100  General (HW)                                                                     
293                 197  Computer architecture  



                                                      

出力には、すべての学者の番号のみがリストされているはずですが、少し明確にするために:

Acnum Deptnum Interest
1        1       g&f
2        1       g&f
3        2        f
4        3        l
5        4       r&l
6        4       r&l

出力は次のようになります: 1 2 5 6

4

4 に答える 4

1

テストされていませんが、良いはずです

SELECT DISTINCT a1.acnum
FROM academic a1
INNER JOIN academic a2 ON a1.deptnum = a2.deptnum
                          AND 
                          a1.acnum <> a2.acnum
INNER JOIN interest i1 ON a1.acnum=i1.acnum
GROUP BY a1.acnum
HAVING COUNT(i1.acnum)=(SELECT COUNT(*)
                        FROM interest i2
                        WHERE i1.acnum=i2.acnum)
于 2013-02-11T07:41:00.470 に答える
0

おそらく、を使用JOINすると、ここでより良い結果が得られる可能性があります。

SELECT DISTINCT a1.acnum
FROM academic a1
JOIN academic a2
ON a1.deptnum = a2.deptnum
AND a1.acnum <> a2.acnum
AND a1.acnum IN (Select acnum
from interest
group by acnum
having count(acnum) >1);
于 2013-02-11T07:26:45.110 に答える
0

共通テーブル式 (サブクエリ) を使用して、学者、その学部、および関心のある数を取得します。次に、2 回クエリを実行して、必要な出力を取得します。

with cte as ( select a.acnum
                     , a.deptnum
                     , count(i.acnum) as int_cnt
              from academic a
                   , interest i
              where i.acnum = a.acnum
              group by  a.acnum
                     , a.deptnum
            )
select ct1.acnum
       , cte1.deptnum
       , cte1.in_cnt
from cte cte1
     , cte cte2
where cte2.deptnum = cte1.deptnum 
and cte2.int_cnt = cte1.int_cnt  
and cte2.acnum != cte1.acnum 
order by cte1.deptnum
         , cte1.acnum

注意- 実際にはテストされていないため、ロジックは健全ですが、構文が間違っている可能性があります;)

于 2013-02-11T09:11:36.260 に答える
0

私の理解によれば、それはうまくいくはずです

SELECT 
      listagg(a1.acnum,',') within group( order by a1.acnum) , a1.deptnum,a2.cnt
FROM 
     academic a1,
     (Select 
            acnum,count(*) as cnt
      from interest
      group by acnum
     ) a2
where 
     a1.acnum=a2.acnum
group by 
     a1.deptnum,a2.cnt
having count(*)>1;
于 2013-02-11T07:44:31.903 に答える