6

私は、Oracle の SQL 実装における内部結合の構文について考えていましたが、ここに少し矛盾しているように見えるものがあります。

ローン (ローン番号、支店名、金額) と借り手 (顧客名、ローン番号) の 2 つのリレーションがあるとします。ローン番号は、両方のテーブルに共通の属性です。現在、Oracle では、内部結合を表現する 2 つの方法を提供しています。

select * 
from loan, borrower 
where loan.loan_number = borrower.loan_number;

上記のステートメントは次と同等です。

select * 
from loan 
     inner join borrower 
     on loan.loan_number = borrower.loan_number;

ただし、クロス結合を表現する場合、それを表現する方法は 1 つしかありません。

select * 
from loan, borrower;

次のステートメントは構文的に正しくありません。

select * 
from loan 
     inner join borrower; 

これは無効です。Oracle は、句の ON... 部分を想定しています。

内部結合がフィルター条件付きの単なるクロス結合であることを考えると、これは Oracle の SQL 実装の矛盾だと思いますか? 何か不足していますか?他の意見も聞いてみたいです。ありがとう。

Davidが回答で指摘したように、構文は次のとおりです。

select * 
from loan cross join borrower;

上記の構文を認識していませんでしたが、それでも矛盾していると思います。結合条件なしで内部結合を許可することに加えて、クロス結合キーワードがあれば問題ありません。交差結合は結合条件のない内部結合ですが、結合条件のない内部結合と表現してはいかがでしょうか。

4

4 に答える 4

4

私はそれが一貫していないことに同意します。

しかし、私はOracleの実装は良いことだと主張します。

  • 結合を行うときは、ほとんどの場合、フィルター条件を含める必要があるため、そのON部分は必須です。
  • 本当に、本当にフィルター条件を持たせたくない場合(本当に確かですか?)、OracleにCROSS JOINsytaxで明示的に指示する必要があります。

100%一貫していないことは私には非常に理にかなっています-それはあなたの間違いを避けるのに役立ちます。

于 2009-11-22T17:55:04.990 に答える
3

SELECT *
FROM Loan
CROSS JOIN Borrower

矛盾はありません。

于 2009-11-22T04:34:50.233 に答える
3

Oracle は、共有列名に基づいて 2 つのテーブルを結合する自然結合構文もサポートしています。両方のテーブルに LOAN_NUMBER という列があるため、これはあなたのケースで機能します。

SELECT *
FROM Loan
NATURAL JOIN Borrower

さて、この場合、キーワード natural の使用は厳密に不要であるという同じ議論を行うことができます。しかし、ロジックに従うと、列名に応じて、このステートメントがクロス結合または自然結合のいずれかになる状況になります。

SELECT *
FROM Loan
JOIN Borrower

LOAN.LOAN_NUMBER を LOAN_ID に名前変更すると結果セットが変更されるという理由だけで、これは明らかに望ましくありません。

だから、あなたの答えがあります:明確化。

于 2009-11-22T07:23:24.393 に答える
2

内部結合を次のように表現します。

select * from loan, borrower where loan.loan_number = borrower.loan_number;

約 20 年間は推奨されません。これは、たまたま内部結合を伝える有効な式であるため、保持されました。現在の標準に近いバージョンを使用することに集中し、誤解や完全なエラーの可能性を最小限に抑えます.

于 2009-11-22T04:49:19.357 に答える