2

SQL で AND と OR を使用するときに問題があります。

これは単一のレコードを返します:

SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND r.Reason LIKE 'Unreadable disk' 

これも単一のレコードを返します。

SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND r.Reason LIKE 'Scratched CD'

しかし、私がこれを行うとき:

SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND r.Reason LIKE 'Unreadable disk' 
OR r.Reason LIKE 'Scratched CD'

「読み取り不能ディスク」の結果は存在し、正しいですが、「傷のある CD」はそうではありません (異なるサプライヤーごとに同じ値を持ちます)。次のように交換した場合:

SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND r.Reason LIKE  'Scratched CD'
OR r.Reason LIKE 'Unreadable disk'

最初の結果は正しい (「傷のある CD」) ですが、「読み取り不能なディスク」は複数のサプライヤーに対して同じ値を返します。

AND OR がクエリを台無しにしているように見えるのはなぜですか?

4

4 に答える 4

2

LIKE は、% ワイルドカードを使用して 0+ ランダムな文字を表すことを意図しています。

AND と OR を組み合わせる場合は () を使用して、あいまいな where 句を防ぎます

于 2012-10-18T18:49:17.683 に答える
2

操作の順序に問題があります。論理が既知であることを確認するために、必ず括弧を使用する必要があります。暗黙的に行っていることは次のとおりです。

    USE CNB_ONLINE
    SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
    FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
    WHERE (sp.SupplierID=s.SupplierID
    AND sp.ProductID=r.productID
    AND r.Reason LIKE 'Unreadable disk')
 (OR r.Reason LIKE 'Scratched CD')

次のようなコードが必要です。

    USE CNB_ONLINE
    SELECT DISTINCT s.SupplierName, r.ReturnID, r.Reason
    FROM tblSupplierProducts sp, tblReturns r,tblSuppliers s
    WHERE sp.SupplierID=s.SupplierID
    AND sp.ProductID=r.productID
    AND (r.Reason LIKE 'Unreadable disk' OR r.Reason LIKE 'Scratched CD')

優先順位はhttp://msdn.microsoft.com/en-us/library/ms190276.aspxで確認できます。AND が OR の前に評価されることがわかります。

于 2012-10-18T18:49:50.290 に答える
1

AND は OR よりも優先されるため、OR ステートメントを実行すると、それが満たされる唯一の基準になります。したがって、クエリの 2 番目にあるステートメントの基準は緩くなります。次のように、クエリを明示的にグループ化する必要があります。

WHERE sp.SupplierID=s.SupplierID
AND sp.ProductID=r.productID
AND (r.Reason LIKE  'Scratched CD'
OR r.Reason LIKE 'Unreadable disk')
于 2012-10-18T18:48:21.097 に答える
1

LIKE を使用するときは、 のようなワイルドカードを入れる必要があります%。それ以外の場合、リテラル文字列を探している場合は、単に=.

WHERE 句の個々の部分を括弧で囲んでみて、それが役立つかどうかを確認してください。

AND sp.ProductID=r.productID
AND ((r.Reason = 'Scratched CD')
    OR (r.Reason = 'Unreadable disk'))
于 2012-10-18T18:48:22.377 に答える