0

次の SQL クエリがありますが、問題が発生しました。実行すると、"products" テーブルの "sn" 列から同じシリアル番号が 2 つ取得されました。

SELECT specifications.productname, 
products.sn, specifications.year,
lendings.lending_date
FROM products
INNER JOIN lendings ON products.id = lendings.product_id
INNER JOIN specifications ON products.sn LIKE CONCAT(\'%\', specifications.sn, \'%\') OR products.type LIKE CONCAT(\'%\', specifications.type, \'%\')
WHERE lendings.user_id = ?

編集:

貸出表:

user_id       product_id
1             1
1             2
2             3

仕様表:

productname   year        type     sn
name1         2012        1        1234
name2         2011        2        4321
name3         2010        3        3241

製品表:

id            sn
1             AAAAAAAA1234
2             BBBBBBBB4321
3             CCCCCCCC3241

EDIT2:

SELECT products.id, 
       specifications.productname, 
       products.sn, 
       specifications.year, 
       lendings.lending_date
FROM products
INNER JOIN lendings ON products.id = lendings.product_id
INNER JOIN specifications ON products2.sn LIKE CONCAT(specifications.sn, \'%\') OR    products.type = specifications.type
WHERE lendings.user_id = ?
4

2 に答える 2

0

条件付きの結合の 1 つが緩すぎる場合

たとえば、同じ製品を指す 2 つの貸出レコードなどです。

于 2012-10-15T16:04:18.567 に答える
0

通常、これは、結合の 1 つに必要なすべての結合列が存在せず、デカルト積を取得していることを意味します。データベース用語では、これはテーブルに結合していて、単一の行に結合することが期待されていますが、複数の行が条件に一致するため、実際には複数の行に結合していることを意味します. これが発生すると、結果に同じ行 (例では製品行) が複数回表示されます。

このシナリオを確認できるようにいくつかのテスト データを投稿したほうがよかったのですが、投稿しなかったため、各結合をチェックして、特定の製品行に対して複数の行が返されていないことを確認することをお勧めします。

特に疑わしいと思われるクエリの一部は、次の結合です。

INNER JOIN specifications ON products.sn LIKE CONCAT(\'%\', specifications.sn, \'%\') OR products.type LIKE CONCAT(\'%\', specifications.type, \'%\')

LIKE複数の行を取得する可能性が高いと思われる演算子を使用して結合しています。

于 2012-10-15T15:55:00.193 に答える