2016-09-11 9 views
2

誰にどのパスが発行されたかに関する情報を扱うデータベースがあります。誰かがパスを失ったら、それは再発行されますが、2番目の問題として記録されます。新しいテーブルが追加されたときにSQLクエリが中断される

私は発行されたすべてのパスのクエリを書き込もうとしていますが、それはホットリストに登録する必要がある場合です。

私はここで働いそれを持っている:http://sqlfiddle.com/#!9/ed700/6(行3:http://sqlfiddle.com/#!9/ed700/4

をしかし、私は、クエリに従業員名を追加しようとすると、それが壊れるは(句「オン」で、未知の列があると言います) 、15と25は

私はこれを引き起こしているものさっぱりだが)が追加されました。..

PSこれは、簡単に投稿できるデータベース構造の簡略版です。

+0

2番目のフィドルでは、 'on clause'の 'Unprocessed.Passes_ID'という項目が提供されています。 –

+0

@ Dr.Avalancheはい、申し訳ありません。それを言っていたはずです。 – Richard

+0

奇妙なことに、「INNER JOIN」に変更すると、http://sqlfiddle.com/#!9/ed700/8 –

答えて

5

ansi結合とnon-ansi結合を混在させるのは良い方法ではありません。クエリのように書き換えることができる:

SELECT 
    PassProcessing.Serial AS Serial, 
    Passes.Type AS CardType, 
    PassProcessing.Issue AS IssueNumber, 
    Employees.Name, 
    (CASE WHEN sub.count > PassProcessing.Issue 
    OR PassProcessing.Cancelled = 1 
     THEN 1 
     ELSE 0 
    END) AS Hotlist 

FROM Passes 
JOIN PassProcessing ON Passes.ID = PassProcessing.Passes_ID 
JOIN Employees ON Passes.Employee_ID = Employees.ID 
LEFT JOIN 
    (SELECT Passes_ID, COUNT(*) AS count 
    FROM PassProcessing 
    GROUP BY Passes_ID) sub 
    ON PassProcessing.Passes_ID = sub.Passes_ID 

正確な理由は、以前on this page.

を発見カンマ演算子(、)との両方が同じ 優先ので、結合式のT1を有していたJOINすることができます、t2 JOIN t3は ((t1、t2)JOIN t3)と解釈されました。今すぐJOINの方が優先順位が高いので、式 は(t1、(t2 JOIN t3))と解釈されます。この変更は、ON句を使用するステートメント に影響します。その句は、結合のオペランドの列 のみを参照することができ、優先順位の変更によって、これらのオペランドの解釈が変更されます( )。

+0

OPの2番目のクエリが機能しない理由を説明してください。また、OPのクエリと同じではありません。 'Employees'テーブルは' LEFT JOIN'ではなく 'INNER JOIN'と結合してください。 –

+0

@Prdp回答が更新されました。 – GavinCattell

+0

+1これに関する文書を見つけるために、リンクを追加することも良いでしょう。また、 'INNER JOIN'を' Employees'テーブルに使うべきです。 – sagi

関連する問題