2017-09-22 4 views
1

SQLクエリには重複するWhere and On条件が含まれています - 目的があるのか​​、クエリが遅くなるのですか?私は、SQLクエリを編集して、おおよそ次のような部分に遭遇してい

SELECT 
    userAddress, employeeAddress, userSSNumber, 
    employeeSSNumber, customerSSNumber, userID, employeeWorkHours, 
    YTDHoursWorked, employeeHireDate 
FROM 
    Users 
LEFT OUTER JOIN 
    Customers ON customerSSNumber = userSSNumber 
LEFT OUTER JOIN 
    (SELECT 
     employeeAddress AS Address, 
     ISNULL((SELECT SUM(employeeWorkHours) 
       FROM Employees AS TempLines 
       WHERE TempLines.employeeSSNumber = Employees.employeeSSNumber 
        AND Templines.employeeHireDate < Employees.employeeHireDate), 0) AS YTDHoursWorked 
    FROM 
     Employees) AS Records ON employeeAddress = Address 

私は部品

where TempLines.employeeSSNumber= Employees.employeeSSNumber 

on employeeAddress = Address 

が完全に冗長であると思われます。私が正しく理解していれば、彼らは値をそれ自体と比較しているだけです。そして、それらのビットを削除すれば、クエリは同じ結果を返します - そうですか?

そして、

Templines.employeeHireDate < Employees.employeeHireDate 

部分は、ネストされた、最もまったく結果を返さない場合に選択し、右側の原因になりますか?

私の例では一貫性のない大文字と、表のデザインと命名規則が貧弱であることをお許しください。これらの可能性のある冗長部分の多くのために実際のクエリははるかに長いです。これらの命名規則を使用しており、テーブルやフィールドを変更することはできません。この質問の一部は、ページ長のクエリを数時間見た後の健全性チェックです。

+2

データベースエンジンのタグとバージョンを常に指定してください – FLICKER

+1

このクエリでは何を想定していますか?従業員が雇用されるまでの総勤務時間を見つけるように見えます! "employeeAddress = Address"の条件を結合すると疑わしいように見えます。なぜSSNのキーフィールドに参加していないのですか? – FLICKER

+0

このクエリは、Crystal Reportsの1つのレポートに使用されるいくつかのフィールドを収集するために使用されます。このクエリは、6つのテーブルから約30のフィールドを収集し、それらのいくつかを合計し、それらをCrystal Reportsが分析する単一のテーブルに配置します。 私の先任者および/またはERPメーカーは、Crystal ReportsのSQLクエリを手動で書き込むことに決めました。それはCrystal Reportsが(私が知る限り)使用されるはずのものではありませんが、それが彼らのやり方です。私が何かを見落とし、誰もエラーをキャッチしなければ、それは従業員の手数料を変更したり、人事(つまり、終了)を変更します。 – user3685427

答えて

2

「TempLines.employeeSSNumber = Employees.employeeSSNumber」という句は、相関サブクエリの一部です。それは、行の合計が指定された行だけであることを確認します。

関連する問題