mysql - 一个sql查询的题目,望路过大神看下
巴扎黑
巴扎黑 2017-04-17 15:52:17
0
6
713

1.上图两个表,要求找出掌握Skills中全部3个技能的员工,即神崎和相田,要求用mysql的语句实现

2.刚学sql,不是很会,想了好久

3.下面是书里面用sql server写的,我也不是很理解,另外mysql中没有except

SELECT DISTINCT emp
  FROM EmpSkills  ES1
 WHERE NOT EXISTS
        (SELECT skill
           FROM Skills
         EXCEPT
         SELECT skill
           FROM EmpSkills ES2
          WHERE ES1.emp = ES2.emp);
巴扎黑
巴扎黑

全員に返信(6)
迷茫

リーリー

対応するデータを置き換えるだけです。

いいねを押す +0
小葫芦

その SQL で表現される意味はおそらく次のとおりです:

従業員がマスターした skill のリストが Skills リストから削除された後に空の場合、この従業員が選択されます。

except の後には、この従業員が習得したすべての skill が続きます。

いいねを押す +0
PHPzhong

1. SQL の本であれ、オンライン情報であれ、人々は長くて複雑な SQL ステートメントを書きたがりますが、これは実際には間違っています。 SQL ステートメントが長すぎて複雑すぎると、構造設計、コード作成、デバッグ、メンテナンス、プロジェクトの引き継ぎなどが困難になるためです。

2. 正しい考え方は、各ステートメントをできるだけ単純かつ短くすることです。より多くの変数、テーブル変数、一時テーブルを使用して複雑さを軽減し、より多くの関数、ストアド プロシージャ、ビューを使用して再利用性を高め、結合とコードの冗長性を軽減します。

いいねを押す +0
黄舟

個人的な質問:
タイトルの説明は不正確ですか?
スキルで 3 つのスキルを習得している従業員を見つける必要があります。この 3 つのスキルだけでなく他のスキルも習得している従業員がいる場合、
そのような従業員は本の SQL ステートメントによって選別されます
あるいは質問は、スキル表のすべてのスキルを習得し、のみ習得する従業員に変更するべきではないでしょうか?

いいねを押す +0
刘奇

問題の核心は、集合 A のすべてのメンバーが集合 B にあることを SQL でどのように表現するかということです。
否定の否定の論理が使用されます: 集合 B にない集合 A のメンバーは存在しません

セット A: Skills テーブルのすべてのレコード
セット B: EmpSkills テーブルは各従業員に対応するレコード

SQL の論理変換のプロセス:
1. EmpSkill の全従業員を検索します

  1. EmpSkill テーブル内の各従業員に対応するスキルを削除します

  2. 上記の「否定の否定」条件に従って、従業員がスキルテーブル内のすべてのスキルを持っているかどうかを判断します


もう 1 つのアイデアは、まず従業員とスキルのマトリックスを構築し、それが EmpSkill テーブルに存在するかどうかを確認することです。存在する場合、除外条件としてはスキルが不完全であることを意味します。SQL は次のようになります。 :

リーリー
いいねを押す +0
伊谢尔伦

SELECT a.emp,SUM((CASE WHEN a.skill='Oracle' THEN 1 ELSE 0 END) + (CASE WHEN a.skill='UNIX' THEN 1 ELSE 0 END) + (CASE WHEN a.skill ='Java' THEN 1 ELSE 0 END)) AS count FROM empskills a JOIN スキル b ON a.skill = b.skill GROUP BY a.emp HAVING count = 3

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!