1

私が使用しているクエリは、データベース内のいくつかのテーブルを呼び出し、正常に動作します。ただし、ミックスに 10 行目を追加すると、50 以上の繰り返し結果が返されます。私はまだ SQL と Sequel Pro に慣れていないので、ソリューションはそれほど複雑ではないと確信していますが、今は本当に困惑しています。

コードは次のとおりです。

SELECT c.first_name, c.last_name, ca.company, ca.city, ca.state, ct.certificate_number,   ct.certificate_date
FROM customer c, customer_type ctype, cust_address ca, certification ct, cust_prof_cert cp
WHERE ca.id_customer = c.id_customer LIKE cp.prof_cert_id_prof_cert
AND c.customer_type_id_customer_type = ctype.id_customer_type
AND ct.customer_id_customer = c.id_customer
AND ca.id_customer = c.id_customer
AND ctype.customer_type IN('CIRA','CIRA, CDBV')
AND ct.course_type_id_course_type = 1
AND ct.certificate_number IS NOT NULL
AND cp.prof_cert_id_prof_cert = "1"
ORDER BY ct.certificate_number ASC, c.last_name ASC;

お時間をいただきありがとうございます。

4

3 に答える 3

2

そのように SQL を実行することで、データを関連付けるのではなく、選択するだけです。JOINS を使用するように SQL を変更することをお勧めします。

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID; 

少しお役に立てるかもしれない記事を次に示します: w3schools, Joins

于 2013-10-31T15:36:18.670 に答える
1

結合に SQL92 構文を使用したクエリを次に示します。SQL89 の「コンマ スタイル」結合の代わりに、この構文を使用する必要があります。

SELECT c.first_name, c.last_name, ca.company, ca.city, ca.state, 
  ct.certificate_number, ct.certificate_date
FROM customer AS c
INNER JOIN customer_type AS ctype ON c.customer_type_id_customer_type = ctype.id_customer_type
INNER JOIN cust_address AS ca ON ca.id_customer = c.id_customer
INNER JOIN certification AS ct ON ct.customer_id_customer = c.id_customer
INNER JOIN cust_prof_cert AS cp    -- what's this join condition?
WHERE ca.id_customer = c.id_customer LIKE cp.prof_cert_id_prof_cert
  AND ctype.customer_type IN('CIRA','CIRA, CDBV')
  AND ct.course_type_id_course_type = 1
  AND ct.certificate_number IS NOT NULL
  AND cp.prof_cert_id_prof_cert = '1'
ORDER BY ct.certificate_number ASC, c.last_name ASC;

このクエリで気付いたいくつかの奇妙な点:

  • WHERE 句の最初の項は奇妙です。LIKEよりも優先順位が高いことを知っておく必要がある=ため、これはあなたが思っていることをしていない可能性があります。書いたかのように

    WHERE ca.id_customer = (c.id_customer LIKE cp.prof_cert_id_prof_cert)
    

    これは、 を評価しLIKE、ブール条件を表す 0 または 1 を生成することを意味します。次に、その 0 または 1 に一致する ca.id_customer を探します。

  • その奇妙な用語を考えると、cpテーブルの他の結合条件を見つけることができません。制限を与えない場合のデフォルトの結合は、すべての行が結合されたテーブルのすべての行と一致することです。したがって、 が 50 行ある場合cp.prof_cert_id_prof_cert = 1、残りの結合されたテーブルの結果に 50 を効果的に掛けることができます。

    これはデカルト積と呼ばれます。または、MySQL の用語では、SHOW STATUS でFull joinとしてカウントされます。

  • ctype.customer_type IN('CIRA','CIRA, CDBV')2 番目と 3 番目の文字列をまとめて引用しました。基本的に、これは列を2 つの文字列と照合しようとしていることを意味し、そのうちの 1 つにたまたまカンマが含まれています。

    おそらくctype.customer_type IN('CIRA','CIRA','CDBV')、列がこれら 3 つの値のいずれかに一致するように記述するつもりでした。

于 2013-10-31T15:51:24.637 に答える
0

FROM 句で複数のテーブルをクエリしないことをお勧めします。これが行の重複の原因だと思います。テーブルを個別の内部結合または左結合に分離する場合 (必要な方)、SQL が自動的にこれを実行するのではなく、各テーブルのキーを手動で照合できるはずです。

于 2013-10-31T15:38:41.760 に答える