0

ここに画像の説明を入力してください

テーブルDEPARTMEnT

テーブルDEPARTMET

テーブル従業員

ここに画像の説明を入力してください

従業員がいない運用部があります。だから、私はクエリが行(画像1)も取得すると信じていました:

Department_ID = 10、Department_Name = Operations、Employee = 0

なぜ起こらないのですか?

 SELECT EMPLOYEE.Department_ID, DEPARTMENT.Department_Name, Count(*) AS Employees 
FROM EMPLOYEE right JOIN DEPARTMENT ON DEPARTMENT.Department_ID = EMPLOYEE.Department_ID
GROUP BY DEPARTMENT.Department_Name,.EMPLOYEE.Department_ID
4

3 に答える 3

1

デフォルトjoinはですinner join。これは、両側に少なくとも1つの行が見つかった行のみを返します。に置き換えjoinleft join、従業員のいない部門を取得します。

コード例:

SELECT  e.Department_ID
,       d.Department_Name
,       count(e.Employee_ID) AS Employees 
FROM    Department d
LEFT JOIN
        Employee e
ON      d.Department_ID = e.Department_ID
GROUP BY 
        d.Department_ID
,       d.Department_Name
于 2012-12-18T19:01:56.150 に答える
1

このクエリで気になる主要なデータはDEPARTMENTテーブルからのものであるため、クエリを次のように書き直すことを検討してください。

SELECT DEPARTMENT.Department_ID, DEPARTMENT.Department_Name, Count(EMPLOYEE.Employee_ID) As Employees 
FROM DEPARTMENT 
LEFT JOIN EMPLOYEE ON EMPLOYEE.Department_ID = DEPARTMENT.Department_ID 
GROUP BY DEPARTMENT.Department_ID, DEPARTMENT.Department_Name
于 2012-12-18T19:07:29.920 に答える
1

これでうまくいくはずです。最初にテーブルがある場合はを入力できますが、これが適切でない理由は、クエリがすぐに混合と結合になり始め、経験豊富なSQLプロフェッショナルでも非常に読みにくくなるためです。あなたに固執することによって、クエリを維持可能で理解しやすい状態に保ちます。(非常にまれな状況では、優先順位が複雑なクエリが単純化される場合がありますが、結合のグループの前後に括弧を追加する必要がないように、2回程度しか実行していません)。RIGHT JOINEMPLOYEELEFTRIGHTLEFT JOINRIGHT JOIN

SELECT
   D.Department_ID,
   D.Department_Name,
   Employees = Count(*) 
FROM
   dbo.DEPARTMENT D
   LEFT JOIN dbo.EMPLOYEE E
      ON D.Department_ID = E.Department_ID
GROUP BY
   D.Department_ID,
   D.Department_Name

また、完全なテーブル名ではなく、テーブルのエイリアスを使用することをお勧めします。エイリアスが一貫して使用されている場合、クエリのスキャンと理解がはるかに簡単になります。テーブル名全体をスペルアウトすると、クエリの他の部分が不明瞭になることがよくあります。

于 2012-12-18T19:23:24.780 に答える