私の会社では、Oracle データベースを使用しています。誰もが次のようにクエリを書いていることに気付きました。
SELECT p.name, p.id, o.issued_date
FROM orders o, products p
WHERE o.productid = p.id;
このような状況でデータベースは何をしているのでしょうか? デカルト積を作成してから、特定の行のみを選択しますか? それは正しく聞こえません。
私の会社では、Oracle データベースを使用しています。誰もが次のようにクエリを書いていることに気付きました。
SELECT p.name, p.id, o.issued_date
FROM orders o, products p
WHERE o.productid = p.id;
このような状況でデータベースは何をしているのでしょうか? デカルト積を作成してから、特定の行のみを選択しますか? それは正しく聞こえません。
このような状況でデータベースは何をしているのでしょうか?
ANSI結合を指定した場合と同じ:
SELECT *
FROM orders o
JOIN products p ON o.productid = p.id
誰もがこのようにクエリを書いていることに気付きました [...]
あなたの会社の多くの人がOracleで長年の経験を積んでいるようです! (+)
外部結合にも記法を使用していると思います。これは、9i リリースより前にOracle でサポートされていた唯一の構文でした。
実際、これは内部結合の最も古い ANSI 標準です。他の回答者は、これは ANSI 構文ではないと言っていましたが、正しくありません。のように構築する
SELECT p.name, p.id, o.issued_date
FROM orders o, products p
WHERE o.productid = p.id;
ANSI 88 標準の SQL (現在は Implicit Join Form と呼ばれています) に準拠しています。ただし、新しい ANSI 92 の明示的な形式の内部結合、外部結合、およびクロス結合に取って代わられました。
-- Inner join
SELECT p.name, p.id, o.issued_date
FROM orders o [INNER] JOIN products p
ON o.productid = p.id
WHERE (residual conditions);
-- Outer joins:
SELECT p.name, p.id, o.issued_date
FROM orders o LEFT|RIGHT|FULL [OUTER] JOIN products p
ON o.productid = p.id
WHERE (residual conditions);
-- Explicit corss join:
SELECT p.name, p.id, o.issued_date
FROM orders o CROSS JOIN products p
WHERE (residual conditions);
これはまさに、以前の構文が誤解を招きやすく、結合条件が残りの条件と簡単に混ざり合って誤って失われる可能性があるため、エラーが発生しやすいためです。これが、明示的な構文を使用することを強く推奨する理由です。
角括弧 [] は「ノイズ」 (オプション) キーワード、垂直バー | を示します。は「OR」を示します (すべてではなく、LEFT、RIGHT、または FULL のいずれかを指定できます)。これが役立つことを願っています。
これは次のとおりです。
SELECT
*
FROM
Orders o
INNER JOIN
Products p
ON
p.id=o.ProductID
SELECT *...
必要な列を決してリストしないでください。また、結合のタイプ (内側、左側、右側、外側) を明示的に指定する必要があります。これは、結合を実装する適切な方法であり、ANSI 構文です。