1

元のデータソースから6つのテーブルを順番に結合するクエリがあります。ネストされた、それは混乱です:

SELECT
FROM
(
    SELECT
    FROM
    (
        SELECT
        FROM
        (. . .)
        INNER JOIN
    )
    INNER JOIN
)

CTE定義に切り替えました。各定義は、前の定義の1つの結合であり、最後の最後のクエリで結果が得られます。

WITH
Table1 (field1, field2) AS
(
    SELECT
    FROM 
    INNER JOIN
),

Table2 (field2, field3) AS
(
    SELECT
    FROM Table1
    INNER JOIN
), . . . 

SELECT 
FROM Table 6

これははるかに読みやすく、依存関係は論理的な順序で下向きに流れます。ただし、各定義は実際には順番に1回しか参照されないため、これはCTEの使用目的(およびビューを使用しない理由)とは思えません。

読み取り可能で論理的な構造のこのような順次ネストされた結合を構築する方法についてのガイダンスはありますか?

4

3 に答える 3

1

CTEを使用して一時的なビューを作成することに何も問題はないと思います。

  1. 大規模なショップでは、DBAと開発者の責任を分離する役割が定義されています。一般に、CREATEステートメントはこの官僚主義の犠牲者になります。したがって、ビューはありません。CTEは非常に良い妥協点です。
  2. とにかくビューが実際に再利用可能でない場合は、SQLと一緒に保持すると、ビューが読みやすくなります。
  3. CTEは、サブクエリよりもはるかに読みやすく直感的です(レベルが1つしかない場合でも)。サブクエリに相関関係がない場合は、すべてのサブクエリをCTEに変換することをお勧めします。
  4. 再帰はCTEの「キラー」アプリですが、それ以外の場合はCTEを使用すべきではないという意味ではありません。

私が考えることができる唯一の欠点は、(データベースエンジンによっては)オプティマイザーが想定していることを実行できなくなる可能性があることです。オプティマイザは、サブクエリを書き換えるのに十分スマートです。

それでは、CTEの悪用について説明しましょう。データベースエンジンの最適化をアプリケーション開発者の知識に置き換えないように注意してください。このソフトウェアを設計した賢い開発者(私たちより賢い)はたくさんいます。cteやサブクエリをできるだけ使わずにクエリを記述して、DBに作業を任せてください。たとえば、開発者が結合を行う前に、サブクエリ内のすべてのキーをDISTINCT/WHEREすることがよくあります。あなたは自分が正しいことをしていると思うかもしれませんが、そうではありません。

あなたの質問に関しては、ほとんどの人は問題を解決することを意図しており、理論的なことについて話し合うことはありません。したがって、あなたは人々にあなたが何を求めているのか頭を悩ませます。私はあなたがあなたのテキストでそれを暗示していなかったとは言いませんが、おそらくもっと力強いです。

于 2012-10-28T18:00:00.750 に答える
0

私は質問を理解していなかったかもしれませんが、何が問題になっていますか:

select * from table1 t1, table2 t2, table3 t3, table4 t4, table5 t5, table6 t6 
where t1.id = t2.id and t2.id = t3.id and  t3.id = t4.id 
  and t4.id = t5.id and t5.id = t6.id

または同じ使用table 1 t1 INNER JOIN table2 t2 ON t1.id = t2.id ....

于 2012-10-26T23:42:57.847 に答える
0

なぜあなたはこのようにあなたのテーブルを結合しなかったのですか

select *
from Table1 as t1
    inner join Table2 as t2 on t2.<column> = t1.<column>
    inner join Table3 as t3 on t3.<column> = t2.<column>
    inner join Table4 as t4 on t4.<column> = t3.<column>
    inner join Table5 as t5 on t5.<column> = t4.<column>
    inner join Table6 as t6 on t6.<column> = t5.<column>
于 2012-10-28T18:19:00.277 に答える