0

これは、このデータベースクエリに問題があります

select 
    abstract_author.name, 
    title, 
    affiliation_number,
    af_name 
from        
    abs_affiliation_name, 
    abstract_affiliation,
    abstracts_item,
    abstract_author,
    authors_abstract 
where 
    abstracts_item._id = authors_abstract.abstractsitem_id and  
    abstract_author._id = authors_abstract.abstractauthor_id and 
    abstract_affiliation._id = abstract_author._id and  
    abs_affiliation_name._id =  abstracts_item._id 

期待通りの結果が得られています。しかし、誰かがそれは推奨される方法でも良い方法でもないと言いました。私のクエリを書くための推奨される方法を教えてください(結合があることを意味します)?

4

3 に答える 3

0

いいえ、クエリに問題はありません。個人的な好みですが、使用した ANSI-89 の暗黙の結合は 20 年以上前のものであり、ANSI-92 では明示的な JOIN 構文に置き換えられました。

Aaron Bertrandは、ほとんどの場合に新しい結合構文を使用することが望ましい理由と、ANSI-89 結合を使用する場合の潜在的な落とし穴について、説得力のある記事を書きました。ほとんどの場合場合によっては、両方のメソッドの実行計画がまったく同じになります (暗黙の結合で誤って交差結合していないと仮定します)。ただし、場合によっては、Oracle が異なる実行計画を生成し、ANSI-89 結合構文が 2 つのより効率的な実行計画を生成できることに注意してください。(私の回答の1つに応じて投稿されたこの例を見ましたが、現時点では見つけることができません。今のところ私の言葉を受け入れる必要があります)。ただし、常に ANSI-89 結合を使用する理由としてこれを使用するつもりはありません。ANSI-92 結合構文を使用するもう 1 つの主な理由は、ANSI 構文で外部結合を実現できることです。一方、暗黙的結合の外部結合構文は DBMS によって異なります。 .

例えばオラクルで

SELECT  *
FROM    a, b
WHERE   a.id = b.id(+)

SQL サーバー上 (非推奨)

SELECT *
FROM    a, b
WHERE   a.id *= b.id

ただし、以下は両方で機能します。

SELECT  *
FROM    a
        LEFT JOIN b
            ON a.id = b.id

常に明示的な結合を使用すると、より一貫性のある (そして私の意見ではより読みやすい) クエリになります。

于 2013-08-01T09:54:15.357 に答える
0

joins とaliases以下のように使用することをお勧めします

select aath.name, /*alias*/title, /*alias*/affiliation_number,/*alias*/af_name 
from abs_affiliation_name aan
join abstracts_item ai on aan._id =  ai._id     
join abstract_affiliation aa on  aa._id = aath._id 
join authors_abstract  aAbs on ai._id = aAbs.abstractsitem_id 
join abstract_author aath on aath._id = aAbs.abstractauthor_id 
于 2013-08-01T09:33:05.967 に答える