1

誰かがどちらがより良い方法であるかを教えてもらえますか?どちらも同じ結果を生成しますが、どちらがより「正しい」ですか?

個人的には、最初のクエリの方が読みやすいと感じていますが、エイリアスを常に使用する必要があることを他の場所で読んでいるようです。

ありがとう

SELECT Patient.PatientSurname, Doctor.DoctorSurname
FROM Patient
JOIN Operation
ON Operation.PatientCode=Patient.PatientCode
JOIN Doctor
ON Doctor.DoctorCode=Operation.DoctorCode
WHERE Operation.OperationType='Broken Arm'
GROUP BY Patient.PatientSurname
HAVING count(Patient.PatientSurname) > 0


SELECT PatientSurname, DoctorSurname
FROM Patient as p, Operation as o, Doctor as d
WHERE o.PatientCode=p.PatientCode
AND  d.DoctorCode=o.DoctorCode
AND o.OperationType='Broken Arm'
GROUP BY p.PatientSurname
HAVING count(p.PatientSurname) > 0
4

1 に答える 1

11

2 つのクエリの違いは、次のJOIN構文です。

  • 最初のものは ANSI-92JOIN構文を使用します。
  • 2 つ目は、古い ANSI-89JOIN構文を使用します。

どちらが良いですか?

どちらの構文も、MySQL と SQL Server およびその他の RDBMS でサポートされており、2 つの間のパフォーマンスの違いは期待できません。それらは同じです。

ただし、最初のものを使用することをお勧めします。多くの点でより安全です。たとえばINNER JOIN、2 番目の構文を使用して を実行する場合:

SELECT *
FROM Table1 t1, Table2 t2
WHERE t1.id = t2.id2;

を忘れてもWHERE t1.id = t2.id、クエリは失敗しません。ただし、クロス結合が発生し、そのエラーを見つけるのが難しくなります。しかし、最初の構文を使用すると:

SELECT *
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id2;

条件を忘れるONと、構文エラーが発生します。あなたがするつもりだったとしても、CROSS JOIN他の人がそれを伝える方が読みやすいでしょう:

SELECT *
FROM Table1 t1 CROSS JOIN Table2 t2 

他の構文より。

@Garethによって指摘された別の利点(以下のコメントを参照):

もう 1 つの大きな利点は、WHERE 句で NULL を処理する必要なく、INNER 結合と OUTER 結合を簡単に切り替えることができることです。

詳細については、次を参照してください。

于 2012-11-08T13:19:18.557 に答える