-3

こんにちは、ストアド プロシージャで OR ステートメントを使用しようとしていますが、思いどおりに動作しません...

ステートメントの最初の部分は完全に実行されますが、OR の後の発言は無視されているようです... OR の代わりに使用する別の単語である必要があると考えています。

ここで私が愚かに聞こえないことを願っています..

これが私のストアドプロシージャです:

SELECT DISTINCT Equipment.EquipmentNo, Equipment.EquipmentDescription AS [Description], Equipment.Barcode, Equipment.SerialNo AS [Serial Number], Equipment.Status
FROM Equipment, AssignEquipment
WHERE (Equipment.Status = 'Open' AND Equipment.Assigned = 'No') OR AssignEquipment.Assigned = 'No'
AND Equipment.EquipmentNo = AssignEquipment.EquipmentNo;
4

2 に答える 2

3

SQL Server では、AND は OR よりも優先されます。したがって、あなたが書いたものは次のものと同等でした:

WHERE (Equipment.Status = 'Open' AND Equipment.Assigned = 'No') OR AssignEquipment.Assigned = 'No'

それがあなたが望むものなら問題ありませんが、あなたが意図した可能性があります:

WHERE Equipment.Status = 'Open' AND (Equipment.Assigned = 'No' OR AssignEquipment.Assigned = 'No')

たとえ操作の順序が正しいとしても、括弧を使用せずに AND と OR を混在させるべきではありません。これにより、コードの保守担当者は意図したことと、それが間違いではなかったことを知ることができます。

また、偶発的である可能性が高いクロス結合の問題もあります。

だから代わりに

FROM Equipment, AssignEquipment

おそらく内部結合または左結合が必要です

FROM Equipment E
JOIN AssignEquipment AE ON AE.EquipmentNo = E.EquimentNo

または

FROM Equipment E
LEFT JOIN AssignEquipment AE ON AE.EquipmentNo = E.EquimentNo

レコードが両方のテーブルに存在する必要がある場合は最初のものを使用し、AssignEquiment に関連レコードがない equiment のレコードが必要な場合は 2 番目を使用します。

于 2013-09-30T21:12:08.933 に答える