0

従業員は多くの部門で働くことができ、各部門には多くの従業員がいる可能性があります。したがって、関係テーブルが必要です

テーブル:
EMP(eid、ename、eage、esalary)
Works(eid、did、pct_time)
Dept(did、dname、budget、managerid)

ソフトウェアとハ​​ードウェアの両方で働くすべての従業員を見つけます。

SELECT e.ename FROM EMP e, Works w, Dept d 
WHERE e.eid = w.eid AND w.did = d.did AND d.did = 
(SELECT did FROM dept WHERE dname = 'Hardware' OR 'Software')  

ジョンによると:

SELECT e.ename FROM EMP e OR Works w OR Dept d 
WHERE e.eid = w.eid AND w.did = d.did AND d.did = 
(SELECT did FROM dept WHERE dname = 'Hardware' OR 'Software')

そして、同じeidの下でハードウェアとソフトウェアの両方のWorksに2つのエントリがあることを確認する方法を理解できません。

4

3 に答える 3

1

クエリの別の定式化は次のとおりです。

SELECT e.*
  FROM emp AS e
  JOIN (SELECT w.eid
          FROM works AS w JOIN dept AS d
            ON d.did = w.did AND d.dname = 'Software') AS s
    ON s.eid = e.eid
  JOIN (SELECT w.eid
          FROM works AS w JOIN dept AS d
            ON d.did = w.did AND d.dname = 'Hardware') AS h
    ON h.eid = e.eid

これには2つの対称的なサブクエリがあります。1つはソフトウェア部門の従業員IDを生成し、もう1つはハードウェア部門の従業員IDを生成します。選択された従業員は、IDが両方の部門にリストされている従業員です(すべて内部結合であるため)。

于 2012-07-25T03:32:29.423 に答える
1
select e.name
  from emp e, works h_w, dept h_d, works s_w, dept s_d
 where e.eid = h_w.eid
   and e.eid = s_w.eid
   and h_w.did = h_d.did
   and h_d.dname = 'Hardware'
   and s_w.did = s_d.did
   and s_d.dname = 'Software'
于 2012-07-25T03:06:24.017 に答える
1

問題に取り組む方法の手順は次のとおりです。

  • まず、works部門がハードウェアまたはソフトウェアのいずれかであるテーブルすべての行を取得します
  • 次に、どの従業員にとっても、2つの行が存在する場合、それは彼/彼女が両方の部門で働いていることを意味します。
  • どの従業員にとっても、存在する行が2つ未満の場合、それは2つのうちの1つだけで作業するか、まったく作業しないことを意味します。
  • 正確に2行の従業員を取得する必要があります。

したがって、最初にできることは、テーブルから選択し、worksテーブルに対して結合して、deptハードウェアまたはソフトウェアではない部門を除外することです。

SELECT a.*
FROM works a
INNER JOIN dept b ON a.did = b.did
WHERE b.dname IN ('Hardware','Software')

次に、各従業員ごとにグループ化することで、従業員あたりの行数や合計/最大/最小/平均などの集計情報にアクセスできるようになります。他の列の。私たちはカウントで作業する必要があります:

SELECT a.eid
FROM works a
INNER JOIN dept b ON a.did = b.did
WHERE b.dname IN ('Hardware','Software')
GROUP BY a.eid
HAVING COUNT(1) = 2

これにより、eid正確に2行のsのみが得られます(つまり、ソフトウェア部門とハードウェア部門の両方で機能します)。

しかし、eidsそれだけでは十分ではありません。従業員に関するすべての情報が必要なので、クエリ全体をラップし、それをemployeesテーブルと結合して、残りの情報を取得する必要があります。

SELECT a.*
FROM emp a
INNER JOIN 
(
    SELECT a.eid
    FROM works a
    INNER JOIN dept b ON a.did = b.did
    WHERE b.dname IN ('Hardware','Software')
    GROUP BY a.eid
    HAVING COUNT(1) = 2
) b ON a.eid = b.eid

そして、あなたはそれを持っています:ソフトウェアとハ​​ードウェアの両方の部門で働く従業員。上記の各クエリを個別に実行して、最終的な解決策に到達するための中間ステップを確認できます。

于 2012-07-25T03:08:05.680 に答える