61

私の前の仕事では、非常にデータベースを多用するアプリケーションに取り組み、共通のレイアウトで全員が SQL を記述できるように、いくつかのフォーマット標準を開発しました。コーディング標準も作成しましたが、これらはプラットフォーム固有のものであるため、ここでは説明しません。

他の人が SQL フォーマット標準に何を使用しているか知りたいです。他のほとんどのコーディング環境とは異なり、私はそれらについてオンラインで多くのコンセンサスを見つけていません。

主なクエリの種類をカバーするには:

select
    ST.ColumnName1,
    JT.ColumnName2,
    SJT.ColumnName3
from 
    SourceTable ST
inner join JoinTable JT
    on JT.SourceTableID = ST.SourceTableID
inner join SecondJoinTable SJT
    on ST.SourceTableID = SJT.SourceTableID
    and JT.Column3 = SJT.Column4
where
    ST.SourceTableID = X
    and JT.ColumnName3 = Y

select、 、の後の改行については意見の相違がありましfromwhere。選択行の意図は、レイアウトを変更せずに「top X」などの他の演算子を許可することです。それに続いて、主要なクエリ要素の後に一貫した改行を維持するだけで、読みやすさが向上するように思われました。

fromandの後の改行whereを削除すると、理解できる改訂になります。ただし、update以下のようなクエリでは、 の後の改行により、where適切な列の配置が得られることがわかります。同様に、group byまたはの後の改行order byは、列のレイアウトを明確で読みやすくします。

update
    TargetTable
set
    ColumnName1 = @value,
    ColumnName2 = @value2
where
    Condition1 = @test

最後に、insert:

insert into TargetTable (
    ColumnName1,
    ColumnName2,
    ColumnName3
) values (
    @value1,
    @value2,
    @value3
)

ほとんどの場合、これらは MS SQL Server Managements Studio / クエリ アナライザーが SQL を書き出す方法からそれほど逸脱していませんが、違いはあります。

このトピックについて Stack Overflow コミュニティでコンセンサスが得られるかどうかを楽しみにしています。多くの開発者が他の言語の標準フォーマットに従っていて、SQL を実行したときに突然ランダムに実行できることに、私はいつも驚かされます。

4

28 に答える 28

20

私はパーティーに遅れましたが、本やマニュアルから学んだにちがいない私の好みの書式設定スタイルを追加します: それはコンパクトです. サンプルSELECTステートメントは次のとおりです。

SELECT  st.column_name_1, jt.column_name_2,
        sjt.column_name_3
FROM    source_table AS st
        INNER JOIN join_table AS jt USING (source_table_id)
        INNER JOIN second_join_table AS sjt ON st.source_table_id = sjt.source_table_id
                AND jt.column_3 = sjt.column_4
WHERE   st.source_table_id = X
AND     jt.column_name_3 = Y

要するに、8 スペースのインデント、大文字のキーワード (ただし、SO は小文字の方が適切に色付けされます)、キャメルケースなし (Oracle では無意味)、および必要に応じて改行します。

UPDATE:_

UPDATE  target_table
SET     column_name_1 = @value,
        column_name_2 = @value2
WHERE   condition_1 = @test

そしてINSERT

INSERT  INTO target_table (column_name_1, column_name_2,
                column_name_3)
VALUES  (@value1, @value2, @value3)

さて、このスタイルには問題があることを最初に認めさせてください。8 スペースのインデントは、インデントの位置をずらすか、単語を単独で分割することORDER BYを意味します。節の述語全体をインデントする方がより自然ですが、通常、次のand演算子は左マージンに揃えます。折り返された行の後のインデントも、いくぶん恣意的です。GROUP BYBYWHEREANDORINNER JOIN

しかし、何らかの理由で、代替案よりも読みやすいと思います。

この書式設定スタイルを使用して、最近のより複雑な作品の 1 つを完成させます。ステートメントで遭遇するほとんどすべてがSELECTこのステートメントに現れます。(また、その起源を偽装するために変更されており、その際にエラーが発生した可能性があります。)

SELECT  term, student_id,
        CASE
            WHEN ((ft_credits > 0 AND credits >= ft_credits) OR (ft_hours_per_week > 3 AND hours_per_week >= ft_hours_per_week)) THEN 'F'
            ELSE 'P'
        END AS status
FROM    (
        SELECT  term, student_id,
                pm.credits AS ft_credits, pm.hours AS ft_hours_per_week,
                SUM(credits) AS credits, SUM(hours_per_week) AS hours_per_week
        FROM    (
                SELECT  e.term, e.student_id, NVL(o.credits, 0) credits,
                        CASE
                            WHEN NVL(o.weeks, 0) > 5 THEN (NVL(o.lect_hours, 0) + NVL(o.lab_hours, 0) + NVL(o.ext_hours, 0)) / NVL(o.weeks, 0)
                            ELSE 0
                        END AS hours_per_week
                FROM    enrollment AS e
                        INNER JOIN offering AS o USING (term, offering_id)
                        INNER JOIN program_enrollment AS pe ON e.student_id = pe.student_id AND e.term = pe.term AND e.offering_id = pe.offering_id
                WHERE   e.registration_code NOT IN ('A7', 'D0', 'WL')
                )
                INNER JOIN student_history AS sh USING (student_id)
                INNER JOIN program_major AS pm ON sh.major_code_1 = pm._major_code AND sh.division_code_1 = pm.division_code
        WHERE   sh.eff_term = (
                        SELECT  MAX(eff_term)
                        FROM    student_history AS shi
                        WHERE   sh.student_id = shi.student_id
                        AND     shi.eff_term <= term)
        GROUP   BY term, student_id, pm.credits, pm.hours
        )
ORDER   BY term, student_id

この嫌悪感は、学生が特定の学期でフルタイムかパートタイムかを計算します。スタイルに関係なく、これは読みにくいです。

于 2009-03-21T17:34:12.010 に答える
20

ソースコードが簡単に読める限り、フォーマットは二の次だと思います。この目的が達成される限り、採用できる優れたレイアウト スタイルは数多くあります。

私にとって重要なもう 1 つの側面は、ショップで採用するコーディング レイアウト/スタイルが何であれ、それがすべてのコーダーによって一貫して使用されるようにすることです。

参考までに、あなたが提供した例をどのように提示するかを以下に示します。私のレイアウトの好みです。特に注目すべき点は、ON節が と同じ行にありjoin、主な結合条件のみが結合にリストされ (つまり、キーの一致)、他の条件がwhere節に移されていることです。

select
    ST.ColumnName1,
    JT.ColumnName2,
    SJT.ColumnName3
from 
    SourceTable ST
inner join JoinTable JT on 
    JT.SourceTableID = ST.SourceTableID
inner join SecondJoinTable SJT on 
    ST.SourceTableID = SJT.SourceTableID
where
        ST.SourceTableID = X
    and JT.ColumnName3 = Y
    and JT.Column3 = SJT.Column4

1 つのヒントとして、Red GateからSQL Promptのコピーを入手してください。希望するレイアウト設定を使用するようにツールをカスタマイズできます。そうすれば、ショップ内のすべてのコーダーがそれを使用して、全員が同じコーディング標準を確実に採用できるようになります。

于 2009-02-06T11:05:33.947 に答える
6

私は C# でオープンソースの SQL フォーマッター (この段階では SQL サーバーのみ) を作成する作業を行っているので、上記のクエリを実行します。

OPと同様の戦略を採用しています。つまり、各「セクション」にはその下にインデントされた子要素があります。必要に応じて、わかりやすくするためにセクション間に空白を追加します。これらは、結合がない場合や最小限の where 条件がない場合は追加されません。

結果:

SELECT
    ST.ColumnName1,
    JT.ColumnName2,
    SJT.ColumnName3

FROM SourceTable ST

INNER JOIN JoinTable JT
        ON JT.SourceTableID = ST.SourceTableID

INNER JOIN SecondJoinTable SJT
        ON ST.SourceTableID = SJT.SourceTableID
       AND ST.SourceTable2ID = SJT.SourceTable2ID

WHERE ST.SourceTableID = X
  AND JT.ColumnName3 = Y
  AND JT.Column3 = SJT.Column4

ORDER BY
    ST.ColumnName1
于 2009-10-28T22:16:42.023 に答える
6
SELECT
    a.col1                  AS [Column1]
    ,b.col2                 AS [Column2]
    ,c.col1                 AS [Column3]
FROM
    Table1 a
    INNER JOIN Table2 b     ON b.Id = a.bId
    INNER JOIN Table3 c     ON c.Id = a.cId
WHERE
    a.col     = X
    AND b.col = Y

ここにある多くの例よりもはるかに多くの行を使用していますが、理解しやすく、列/句/テーブルをすばやく削除できると思います。縦向きのモニターを利用すると便利です。

于 2014-02-19T05:01:55.483 に答える
6

良い。Python プログラマーとしての私の好みは次のとおりです。

selectの後の改行。読みやすくするためfromwhere必要な場合のみ。

コードがよりコンパクトで同等に読みやすい場合、私は通常、よりコンパクトな形式を好みます。より多くのコードを 1 画面に収めることができると、生産性が向上します。

select ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3
from SourceTable ST
inner join JoinTable JT
    on JT.SourceTableID = ST.SourceTableID
inner join SecondJoinTable SJT
    on ST.SourceTableID = SJT.SourceTableID
    and JT.Column3 = SJT.Column4
where ST.SourceTableID = X and JT.ColumnName3 = Y

最終的には、これはコード レビュー中に行われる判断の呼び出しになります。

の場合insert、括弧を別の方法で配置します。

insert into TargetTable (
    ColumnName1,
    ColumnName2,
    ColumnName3)
values (
    @value1,
    @value2,
    @value3)

このフォーマットの理由は、SQL が (Python のように) ブロック構造にインデントを使用する場合、括弧は必要ないからです。したがって、とにかくインデントを使用する場合、括弧がレイアウトに与える影響は最小限に抑える必要があります。これは、それらを行末に配置することによって実現されます。

于 2009-02-06T11:16:49.057 に答える
4

ジョンの提案に基づいて、次のスタイルを提案します。

/*
<Query title>
<Describe the overall intent of the query>
<Development notes, or things to consider when using/interpreting the query>
*/
select
    ST.ColumnName1,
    JT.ColumnName2,
    SJT.ColumnName3
from 

    -- <Comment why this table is used, and why it's first in the list of joins>
    SourceTable ST

    -- <Comment why this join is made, and why it's an inner join>
    inner join JoinTable JT
        on ST.SourceTableID = JT.SourceTableID

    -- <Comment why this join is made, and why it's an left join>
    left join SecondJoinTable SJT
        on  ST.SourceTableID = SJT.SourceTableID
        and JT.Column3 = SJT.Column4

where

    -- comment why this filter is applied
    ST.SourceTableID = X

    -- comment why this filter is applied
    and JT.ColumnName3 = (
            select 
                somecolumn
            from 
                sometable
        )
;

利点:
- コメントは、コードを読みやすくし、間違いを検出するために不可欠です。
- 結合に -all- "on"-filters を追加すると、内部結合から左結合に変更する際のミスを回避できます。
- セミコロンを改行に配置すると、where 句の追加/コメントが簡単になります。

于 2015-01-20T13:02:31.603 に答える
3

私はあなたのものに似たレイアウトを使用する傾向がありますが、さらにいくつかの手順を踏みます。

select
        ST.ColumnName1
    ,   JT.ColumnName2
    ,   SJT.ColumnName3
from
                SourceTable     ST

    inner join  JoinTable       JT
        on  JT.SourceTableID    =   ST.SourceTableID

    inner join  SecondJoinTable SJT
        on  ST.SourceTableID    =   SJT.SourceTableID

where
        ST.SourceTableID    =   X
    and JT.ColumnName3      =   Y
    and JT.Column3          =   SJT.Column4

最初は少しやりすぎに見えるかもしれませんが、SQL の宣言的な性質を考えると、このように集計を使用すると、最もクリーンで体系的なレイアウトが得られます。

おそらく、ここであらゆる種類の答えにたどり着くでしょう。最終的には、個人またはチームが合意した好みに依存します。

于 2009-02-06T11:23:21.477 に答える
2

ONキーワードを結合と同じ行に配置し、すべての結合/選択基準が適切に整列するように行の最後に演算子ANDを配置することを除いて、私はあなたと同様の形式を使用します。OR

私のスタイルはJohnSansomのスタイルに似ていますが、WHERE条項に結合基準を含めることについては同意しません。整理されて見つけやすいように、結合されたテーブルを使用する必要があると思います。

また、新しい行に括弧を付け、その上の行に揃えてから次の行にインデントする傾向がありますが、短いステートメントの場合は、元の行に括弧を付けたままにすることができます。例えば:

SELECT
     my_column
FROM
     My_Table
WHERE
     my_id IN
     (
          SELECT
               my_id
          FROM
               Some_Other_Table
          WHERE
               some_other_column IN (1, 4, 7)
     )

ステートメントの場合、それぞれとにCASE改行とインデントを付け、後ろを:に揃えます。WHENELSEENDCASE

CASE
     WHEN my_column = 1 THEN 'one'
     WHEN my_column = 2 THEN 'two'
     WHEN my_column = 3 THEN 'three'
     WHEN my_column = 4 THEN 'four'
     ELSE 'who knows'
END
于 2009-02-06T12:51:10.893 に答える
2

意見の相違の多さは恐ろしい。これは私の組織が使用しているものです。

 SELECT ST.ColumnName1,
        JT.ColumnName2,
        SJT.ColumnName3
   FROM SourceTable ST
  INNER JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID
  INNER JOIN SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID 
        AND JT.Column3 = SJT.Column4
  WHERE ST.SourceTableID = X
    AND JT.ColumnName3 = Y

8文字のインデントを維持することは、読みやすさの鍵です。

于 2015-11-20T19:22:00.517 に答える
1

私はこの議論に非常に遅れていることを認識していますが、私の考えを述べたいと思います. 私は間違いなく行頭のコンマに賛成です。Adam Ralphが言うように、フィールドをコメントアウトする方が簡単です。また、最初にあるときに誤ってコンマを見逃すのがより難しいこともわかりましたが、これは大きな問題のようには聞こえません. 私は過去に長い T-SQL プロシージャで偶発的な構文エラーを追跡するのに何時間も費やしましたが、行末のコンマを誤って見逃していました (おそらくこれも行った人もいるでしょう)。 . また、私は可能な限りエイリアシングを支持しています。

ただし、全体としては、すべて個人の好みによるものであり、一部の人にとってはうまくいくものも、他の人にとってはそうではないことも理解しています. コードを簡単に読むことができ、各開発者が全体を通してスタイルにある程度の一貫性を示している限り、それが最も重要だと思います。

于 2009-09-08T08:45:54.340 に答える
1

あなたのプロジェクト内で、そして一般的に SQL フォーマットを標準化しようとするあなたの努力に心から同意します。

また、フォーマットの選択にも非常に同意します。私はほぼ同じものを思いつきましたが、'join' ステートメントもインデントし、'on' ステートメントをもう 1 つインデントします。

キーワードで小文字を使用するという事実と非常によく似ています-誰があなたに叫びましたか。また、テーブルのエイリアスを小文字にすることを好みます - 読みやすくなります

小さなインデントを使用するという事実に非常に似ています(4)。私は(3)で行きます。

「内側」と「外側」という用語は不要なので省略します。

selectステートメントをフォーマットする方法は次のとおりです。

select
   st.ColumnName1,
   jt.ColumnName2,
   sjt.ColumnName3
from 
   SourceTable st
   join JoinTable jt on jt.SourceTableID = st.SourceTableID
   join SecondJoinTable sjt on
      st.SourceTableID = sjt.SourceTableID and
      jt.Column3 = sjt.Column4
where
   st.SourceTableID = X
   and jt.ColumnName3 = Y
;

これについて議論していただきありがとうございます。

于 2014-11-13T20:36:11.970 に答える
1

このスレにはいいところがたくさんあります。私が人々に使用するよう説得しようとしてきた 1 つの標準は、各列の前の同じ行にコンマを配置することです。そのようです:

Select column1
   ,column2
   ,column3
   ,column4
   ,Column5 ...ect

とは対照的に:

Select column1,
   column2,
   column3, ect...

私がこの方法を好む理由は、必要に応じて行をコメントアウトすることができ、対応するコンマもコメントアウトされているため、実行時にコンマの問題が発生しないためです。スレッドで別のユーザーが同様にこれを行ったのを見たことは知っていますが、実際には指摘していません。会話に持ち込む大きな啓示ではありませんが、私の2セントです。ありがとう

于 2016-04-12T15:59:41.930 に答える
1

既に記述されている T-SQL を変更する場合は、既に使用されている規則に従います (存在する場合)。

私が最初から書いている場合、または慣習がない場合は、質問に記載されている慣習に従う傾向がありますが、キーワードに大文字を使用することを好みます (読みやすさのための個人的な好みにすぎません)。

他のコード形式の規則と同様に、SQL の書式設定でも、重要な点は、その規則が何であるかではなく、規則を持つことです (もちろん、常識の範囲内で!)

于 2009-02-06T11:10:14.530 に答える
1

ええ、厳密に定義された方法でSQLをレイアウトすることの価値はわかりますが、命名規則と意図の方がはるかに重要です. 10倍重要なようです。

それに基づいて、私のペットの嫌いなものは、tbl で始まるテーブルと、sp で始まるストアド プロシージャです。それらがテーブルと SP であることはわかっています。DBオブジェクトの命名は、スペースの数よりもはるかに重要です

ちょうど私の $0.02 の価値

于 2009-02-06T11:12:15.913 に答える
1

私の答えは、によって受け入れられた答えに似ていますJohn Sansom answered Feb 6 '09 at 11:05。ただし、 Red Gate の SQL Prompt に関する彼の回答とは対照的に、NOTEPAD++ で SQLInForm プラグインを使用していくつかの書式設定オプションを示します。

SQLInForm プラグインには、セットアップ可能な 5 つの異なるプロファイルがあります。プロファイル内には、無料版と有料版の両方で利用できる多くの設定があります。完全なリストは以下にあり、プラグインヘルプ一般オプションページをオンラインで 見ることができます.

自分の好みについてとりとめのない議論をする代わりに、利用可能な SQLInForm オプションを提示することが有用であると考えました。私の好みのいくつかも以下に記されています。私の投稿の最後に、元の投稿 ( originalVS format1VS format2) で使用されたフォーマットされた SQL コードがあります。

ここで他の回答を読んでください-私はいくつかの点で少数派のようです。私は好きですleading commasここに短いビデオがあります)-- IMO、新しいフィールドが選択されているときははるかに読みやすいです。また、私Column1 with linebreakはSELECTの隣ではなく、私が好きです。


以下は、SELECT ステートメントを考慮した、私の好みのメモの概要です。13 セクションすべてのスクリーンショットを追加します。しかし、これは多くのスクリーンショットです。無料版をお勧めします。スクリーンショットをいくつか撮り、フォーマット コントロールをテストしてください。私はすぐにプロ版をテストする予定です。しかし、オプションに基づいて、それは本当に役に立ち、わずか 20 ドルであると思われます。

SQLInForm Notepadd++: オプションと設定

1.一般(無料)

DB: 任意の SQL、DB2/UDB、Oracle、MSAccess、SQL Server、Sybase、MYSQL、PostgreSQL、Informix、Teradata、Netezza SQL

[スマート インデント]= FALSE

2.色(無料)

3. キーワード (PRO)

[大文字/小文字]> キーワード

4.改行>リスト(無料)

[カンマの前]=TRUE 5

[コンマを 2 列左に移動]= FALSE

5.改行>選択(PRO)

[結合> 結合後]= FALSE

[JOIN>ON前]=FALSE

(変更なし)--> [JOIN> インデント JOIN]; 【JOIN>ON後】

6. 改行 > Ins/Upd/Del (PRO)

7. 改行 > 条件 (PRO)

CASE ステートメント --> [WHEN]、[THEN]、[ELSE] … これらの設定を試して、適切なものを選択したいのは確かです

8.アライメント(PRO)

(変更なし)--> [JOIN> インデント JOIN]; 【JOIN>ON後】

9. 空白 (PRO)

(変更しますか?) 空行 [すべて削除]=TRUE; [すべて保ちます]; 【一つキープ】

10. コメント (PRO)

(変更?) 行とブロック --> [ブロック コメントの前後の改行]=TRUE; [行コメントをブロックに変更]; 【ブロックインライン】

11. ストアド プロシージャ (PRO)

12.上級(PRO)

(役に立つかもしれません) プログラム コードから SQL を抽出します--> [ExtractSQL]

13. ライセンス


SQL コード

元のクエリ形式。

select
    ST.ColumnName1,
    JT.ColumnName2,
    SJT.ColumnName3
from 
    SourceTable ST
inner join JoinTable JT
    on JT.SourceTableID = ST.SourceTableID
inner join SecondJoinTable SJT
    on ST.SourceTableID = SJT.SourceTableID
    and JT.Column3 = SJT.Column4
where
    ST.SourceTableID = X
    and JT.ColumnName3 = Y

CONVERSION Preferred FORMAT (オプション #1: JOIN 改行なし)

SELECT
    ST.ColumnName1
    , JT.ColumnName2
    , SJT.ColumnName3
FROM
    SourceTable ST
    inner join JoinTable JT 
        on JT.SourceTableID = ST.SourceTableID
    inner join SecondJoinTable SJT
        on ST.SourceTableID = SJT.SourceTableID
        and JT.Column3      = SJT.Column4
WHERE
    ST.SourceTableID   = X
    and JT.ColumnName3 = Y

CONVERSION Preferred FORMAT (オプション #2: 改行で結合)

SELECT  
    ST.ColumnName1
    , JT.ColumnName2
    , SJT.ColumnName3
FROM
    SourceTable ST
    inner join
        JoinTable JT
        on JT.SourceTableID = ST.SourceTableID
    inner join
        SecondJoinTable SJT
        on ST.SourceTableID = SJT.SourceTableID
        and JT.Column3      = SJT.Column4
WHERE
    ST.SourceTableID   = X
    and JT.ColumnName3 = Y

お役に立てれば。

于 2018-10-24T17:34:02.793 に答える
0

私は自分の SQL をそのようにフォーマットするのが好きですが、意図が読みやすい限り、ほとんどのフォーマットが機能します。クエリ デザイナーで作成されたステートメントがそのまま放置されているのを見るのは本当に嫌です。他の誰かのプロシージャ/ビュー/関数/トリガーなどを編集している場合は、既に使用されているフォーマットを維持しようとします (それが本当に悪い場合を除き、全体を再フォーマットします)。

ステートメントを選択

SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3
  FROM SourceTable ST INNER JOIN
       JoinTable JT ON JT.SourceTableID = ST.SourceTableID 
       INNER JOIN
       SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID
                          AND JT.Column3 = SJT.Column4
WHERE (ST.SourceTableID = X)
  AND (JT.ColumnName3 = Y);

ステートメントの更新

UPDATE TargetTable SET
       ColumnName1 = @value,
       ColumnName2 = @value2
 WHERE (Condition1 = @test);

ステートメントを挿入

INSERT INTO TargetTable 
           (
             ColumnName1,
             ColumnName2,
             ColumnName3
           ) 
           values 
           (
             @value1,
             @value2,
             @value3
           );
于 2015-02-27T21:17:22.247 に答える
0

ここにはすでに100の答えがありますが、何年にもわたって多くのことを行ったり来たりした後、これが私が落ち着いたものです:

SELECT      ST.ColumnName1
          , JT.ColumnName2
          , SJT.ColumnName3

FROM        SourceTable       ST
JOIN        JoinTable         JT  ON  JT.SourceTableID  =  ST.SourceTableID
JOIN        SecondJoinTable  SJT  ON  ST.SourceTableID  =  SJT.SourceTableID
                                  AND JT.Column3        =  SJT.Column4

WHERE       ST.SourceTableID  =  X
AND         JT.ColumnName3    =  Y

余分なテーブルが 1 つあるとコードの多くの行を再インデントする可能性があるため、これが厄介な差分になる可能性があることはわかっていますが、読みやすくするために気に入っています。

于 2017-11-16T16:39:40.887 に答える
0
SELECT st.ColumnName1
      ,jt.ColumnName2
      ,sjt.ColumnName3
FROM   SourceTable st
JOIN   JoinTable jt ON jt.SourceTableID = st.SourceTableID
JOIN   SecondJoinTable sjt ON SstT.SourceTableID = sjt.SourceTableID
                              AND jt.Column3 = sjt.Column4
WHERE  st.SourceTableID = X
       AND jt.ColumnName3 = Y

アクションの単語、結合、または句にすべて大文字を使用すると、より目立ちます。JOIN は INNER JOIN と同じなので、INNER を書き出す必要はありません。必要な場合は、OUTER JOIN または LEFT JOIN と書きます。エイリアス名にも小文字を使用します。最後の列をコメントアウトすると、上のコンマで立ち往生し、クエリが失敗することがよくあります。

于 2017-06-14T20:22:42.803 に答える
-1

バグを簡単に見つけて修正できるため、適切な書式設定ルールを持つことは非常に重要だと思います。よく言われるように、「コードを 1 回書くと、このコードは 10000000 回読み込まれる」ので、フォーマットに時間を費やすことは常に良いことです。主な目標は次のとおりです。

  • コードを読みやすく理解しやすくする
  • コードの保守または拡張に必要な労力を最小限に抑える
  • システムのユーザーと開発者が、コード コメントやソフトウェア マニュアルなどの二次的なドキュメント ソースを参照する必要性を減らす

私が常に使用するいくつかのルール:

  • 常に使用します。表記
  • 列の前に常にエイリアスを使用するため、. 表記
  • 行末にandandを入れますor
  • 不要なブラケットを使用しない
  • 大文字を使用しないでください
  • 通常、ネストされたサブクエリよりも CTE を使用することを好む

例として、この質問で例として使用されるクエリをフォーマットする方法を次に示します。

select
    ST.ColumnName1,
    JT.ColumnName2,
    SJT.ColumnName3
from <schema>.SourceTable as ST
    inner join <schema>.JoinTable as JT on
        ST.SourceTableID = JT.SourceTableID
    inner join <schema>.SecondJoinTable as SJT on
        SJT.SourceTableID = ST.SourceTableID and
        SJT.Column4 = JT.Column3
where
    ST.SourceTableID = X and
    JT.ColumnName3 = Y

そして「学生」クエリ:

select
    term,
    student_id,
    case
        when (ft_credits > 0 and credits >= ft_credits) or (ft_hours_per_week > 3 and hours_per_week >= ft_hours_per_week) then 'F'
        else 'P'
    end as [status]
from (
    select
        a.term,
        a.student_id,
        pm.credits as ft_credits,
        pm.[hours] as ft_hours_per_week,
        sum(a.credits) as credits,
        sum(a.hours_per_week) as hours_per_week
    from (
        select
            e.term, e.student_id, NVL(o.credits, 0) credits,
            case
                when NVL(o.weeks, 0) > 5 then
                    (NVL(o.lect_hours, 0) + NVL(o.lab_hours, 0) + NVL(o.ext_hours, 0)) / NVL(o.weeks, 0)
                else
                    0
            end as hours_per_week
        from enrollment as e
            inner join offering as o using (term, offering_id)
            inner join program_enrollment as pe on pe.student_id = e.student_id and pe.term = e.term and pe.offering_id = e.offering_id
        where
            e.registration_code Not in ('A7', 'D0', 'WL')
    ) as a
        inner join student_history as sh using (student_id)
        inner join program_major as pm on pm._major_code = sh.major_code_1 and pm.division_code = sh.division_code_1
    where
        sh.eff_term = 
            (
                select max(eff_term)
                from student_history as shi
                where
                    shi.student_id = sh.student_id and
                    shi.eff_term <= term
             )
    group by
        a.term,
        a.student_id,
        pm.credits,
        pm.[hours]
) as a
order by
    term,
    student_id
于 2015-06-02T15:37:19.320 に答える
-5

ほとんどのユーザーは、800x600 のみをサポートするモニターで作業しているようです。私のモニターは 1920x1080 を実行するので、右側のスペースをすべて使用したいと考えています。

これはどう:

select col1, col2, col3
, case when x = 1 then 'answer1'
       else 'answer2'
  end
, col4, col5, col6, col7
from table1 t1
inner join table2 t2 on t1.col1 = t2.col1 and t1.col2 and t2.col2
where t1.col5 = 19 and t1.col7 = 'Bill Gates'
于 2015-02-17T16:26:41.567 に答える