78

What is the accepted practice for indenting SQL statements? For example, consider the following SQL statement:

SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)

How should this be indented? Many thanks.

4

24 に答える 24

47
SELECT column1
     , column2
FROM table1
WHERE column3 IN
(
    SELECT TOP(1) column4
    FROM table2
    INNER JOIN table3
    ON table2.column1 = table3.column1
)

私はすべての"," を前に置くのが好きです。このようにして、SQL エディターから X 行でエラーが発生したときにそれらを検索することはありません。


これは、このタイプの書き込み SQL ステートメントを使用しない場合の例です。両方とも、カンマが欠落しているというエラーが含まれています。

SELECT sdcolumn123
 , dscolumn234
 , sdcolumn343
 , ffcolumn434
 , sdcolumn543
 , bvcolumn645
  vccolumn754
 , cccolumn834
 , vvcolumn954
 , cvcolumn104
FROM table1
WHERE column3 IN
(
    ...
)

SELECT sdcolumn123, dscolumn234, asdcolumn345, dscolumn456, ascolumn554, gfcolumn645 sdcolumn754, fdcolumn845, sdcolumn954, fdcolumn1054
FROM table1
WHERE column3 IN
(
    ...
)

最初の例の方が簡単で速いことがわかりました。この例が私の視点をより多く示してくれることを願っています。

于 2008-11-07T14:31:25.520 に答える
28
SELECT column1, column2
FROM table
WHERE column3 IN (
    SELECT TOP(1) column4
    FROM table2
    INNER JOIN table3 ON table2.column1 = table3.column1
)

これはかなり短くて読みやすいです。より多くの列が選択されていたり、より多くの結合条件があれば調整します。

于 2008-11-07T14:30:47.690 に答える
24

受け入れられている慣行があるかどうかはわかりませんが、今私がそれを行う方法は次のとおりです。

SELECT 
    column1, 
    column2 
FROM 
    table1 
WHERE 
    column3 IN 
    ( 
     SELECT TOP(1) 
         column4 
     FROM 
         table2 
         INNER JOIN 
         table3 
             ON table2.column1 = table3.column1 
    )
于 2008-11-07T14:31:20.933 に答える
20

コードに空白の「川」を入れるのが好きです。これにより、スキャンが少し簡単になります。

SELECT column1,
       column2
  FROM table1
 WHERE column3 IN (SELECT column4
                     FROM table2
                     JOIN table3
                       ON table2.column1 = table3.column1);
于 2008-11-07T14:41:01.897 に答える
18

キーワードを右側に並べるjalbertの形が好きです。また、AND と OR を左側に配置するのが好きだと付け加えておきます (右側に配置する人もいます)。さらに、可能であれば等号を並べるのが好きです。


SELECT column1, 
       column2  
  FROM table1, table2 
 WHERE table1.column1 = table2.column4 
   AND table1.col5    = "hi" 
    OR table2.myfield = 678 
于 2008-11-07T15:03:44.440 に答える
13

これは私の個人的な方法です。結合条件の長さによっては、下の行でインデントすることがあります。

SELECT
  column1,
  column2
FROM
  table1
WHERE
  column3 IN ( 
    SELECT TOP(1)
      column4
    FROM
      table2
      INNER JOIN table3 ON table2.column1 = table3.column1
  )


SELECT
  column1,
  column2
FROM
  table1
WHERE
  column3 IN ( 
    SELECT TOP(1)
      column4
    FROM
      table2
      INNER JOIN table3
        ON table2.column1 = table3.column1 -- for long ones
  )
于 2008-11-07T14:30:42.900 に答える
8

私は、読みやすさ/「発見しやすさ」に極端に偏っているショップ用のコード標準を作成しました (後者は主に挿入選択ステートメントで役立ちます)。

SELECT 
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN
    (
        SELECT TOP(1) 
            column4
        FROM 
            table2
            INNER JOIN table3 ON table2.column1 = table3.column1
    )

より複雑なクエリでは、これがどのように役立つかがより明確になります。

SELECT
    Column1,
    Column2,
    Function1
    (
        Column1,
        Column2
    ) as Function1,
    CASE
    WHEN Column1 = 1 THEN
        a
    ELSE
        B
    END as Case1       
FROM
    Table1 t1
    INNER JOIN Table2 t2 ON t1.column12 = t2.column21
WHERE
    (
        FilterClause1
        AND FilterClause2
    )
    OR
    (
        FilterClause3
        AND FilterClause4
    )

ほとんどのクエリで複数の結合を使用するシステムに移行すると、縦方向のスペースを自由に使用することが複雑な SQL との最良の友になるというのが私の経験です。

于 2008-11-07T15:17:27.610 に答える
7

SQL の書式設定は、さまざまな相違点や意見の相違がある領域です... しかし、fwiw、私は読みやすさに焦点を当てるのが好きであり、何をするにしても、読みやすさを低下させる規則に一貫して準拠することは、古い決まり文句にあるように、 「愚かな一貫性」(「愚かな一貫性は、単純な心のホブゴブリンです」)

したがって、それらをルールと呼ぶ代わりに、いくつかのガイドラインを示します。SQL ステートメント (Select、Insert、Delete、From、Where、Having、Group BY、Order By など) の各主要句は、簡単に識別できるはずです。したがって、私は通常、それらを最高レベルでインデントします。次に、各句内で、次の論理サブ構造を均等にインデントします...など..しかし、個々のケースでそうする方が読みやすい場合は、パターンを自由に変更します(そして頻繁に行います)...複雑な Case ステートメントが良い例です。水平スクロールを必要とするものは読みやすさを大幅に低下させるため、複雑な (入れ子になった) Case 式を複数行で記述することがよくあります。その場合、SQL ステートメント内の論理的な場所に基づいて、そのようなステートメントの先頭をぶら下げインデントに保つようにします。

SQL データベースのコードは、コンピュータが小文字を使用するようになる前から長い間存在していたため、大文字のキーワードが好まれる歴史がありますが、私は伝統よりも読みやすさを好みます... (そして、私が使用するすべてのツールは現在、キーワードを色分けしています)とりあえず)

また、テーブル エイリアスを使用して、クエリの構造を理解するために目でスキャンしなければならないテキストの量を減らします (エイリアスが混乱を引き起こさない限り)。テーブルが 3 つまたは 4 つ未満のクエリでは、1 文字のエイリアスで問題ありません。すべてのテーブルが異なる文字で始まる場合は、テーブルの最初の文字を使用することがよくあります。最後に、データベースがサポートしている場合、キーワードの多くはオプションです ("Inner"、"Outer"、エイリアスの "As" など)。"Into" (Insert Into から) は Sql Server ではオプションですが、そうではありません。 Oracle の場合) したがって、コードをプラットフォームに依存しないようにする必要がある場合は、これを使用することに注意してください...

あなたの例、私は次のように書きます:

Select column1, column2
From table1 T1
Where column3 In (Select Top(1) column4
                  From table2 T2
                     Join table3 T3
                         On T2.column1 = T3.column1)

または

Select column1, column2
From table1 T1
Where column3 In 
     (Select Top(1) column4
      From table2 T2
         Join table3 T3
            On T2.column1 = T3.column1)

select句にさらに多くの列がある場合は、2行目以降をインデントします...垂直方向にスクロールすると、水平方向にスクロールするのと同じくらい読みやすさが悪いため、通常、厳密な(行ごとに1列)種類のルールには従いません特に、画面の最初の 10 列だけにテキストがある場合)

Select column1, column2, Col3, Col4, column5,
    column6, Column7, isNull(Column8, 'FedEx') Shipper,
    Case Upper(Column9) 
       When 'EAST'  Then 'JFK'
       When 'SOUTH' Then 'ATL'
       When 'WEST'  Then 'LAX'
       When 'NORTH' Then 'CHI' End HubPoint
From table1 T1
Where column3 In 
     (Select Top(1) column4
      From table2 T2
         Join table3 T3
            On T2.column1 = T3.column1)

最も読みやすい方法でコードをフォーマットします...

于 2008-11-07T15:02:15.753 に答える
7

タイピングやタブ操作を一切行わずに再フォーマットしたい長い SQL ステートメントがある場合は、この Web サイトに叩き込んで、きれいにフォーマットされた結果を得ることができます。さまざまな形式を試して、どの形式がテキストを最も読みやすくするかを確認できます。

編集:これが 2014 年の SQL フォーマッタの場所だと思います。

于 2008-11-07T15:27:58.713 に答える
5

クエリのさまざまな部分を垂直に並べるのが好きです。私はSQLに8スペースのタブサイズを使用する傾向がありますが、これはうまく機能しているようです。

SELECT  column1, 
        column2
FROM    table1
WHERE   column3 IN
(
        SELECT TOP(1) column4
        FROM    table2
        INNER JOIN table3
        ON      table2.column1  = table3.column1
)
于 2008-11-07T14:44:48.143 に答える
5

非常に非常に複雑な SQL をインデントする例:

SELECT 
    produtos_cesta.cod_produtos_cesta, 
    produtos.nome_pequeno,
    tab_contagem.cont,
    produtos_cesta.sku, 
    produtos_kits.sku_r AS sku_kit, 
    sku_final = CASE
        WHEN produtos_kits.sku_r IS NOT NULL THEN produtos_kits.sku_r
        ELSE produtos_cesta.sku
    END,
    estoque = CASE
        WHEN produtos2.estoque IS NOT NULL THEN produtos2.estoque
        ELSE produtos.estoque
    END,
    produtos_cesta.unidades as unidades1, 
    unidades_x_quantidade = CASE
        WHEN produtos.cod_produtos_kits_tipo = 1 THEN CAST(produtos_cesta.quantidade * (produtos_cesta.unidades / tab_contagem.cont) * produtos_kits.quantidade AS int)
        ELSE CAST(produtos_cesta.quantidade * produtos_cesta.unidades AS int)
    END,
    unidades = CASE
        WHEN produtos.cod_produtos_kits_tipo = 1 THEN produtos_cesta.unidades / tab_contagem.cont * produtos_kits.quantidade
        ELSE produtos_cesta.unidades
    END,
    unidades_parent = produtos_cesta.unidades,
    produtos_cesta.quantidade,
    produtos.controla_estoque, 
    produtos.status
FROM 
    produtos_cesta 
INNER JOIN produtos 
    ON (produtos_cesta.sku = produtos.sku) 
INNER JOIN produtos_pacotes 
    ON (produtos_cesta.sku = produtos_pacotes.sku) 
INNER JOIN (
    SELECT 
        produtos_cesta.cod_produtos_cesta,
        cont = SUM(
            CASE
                WHEN produtos_kits.quantidade IS NOT NULL THEN produtos_kits.quantidade
                ELSE 1
            END
        )
    FROM 
        produtos_cesta 
    LEFT JOIN produtos_kits 
        ON (produtos_cesta.sku = produtos_kits.sku) 
    LEFT JOIN produtos 
        ON (produtos_cesta.sku = produtos.sku) 
    WHERE 
        shopper_id = '" + mscsShopperId + @"' 
    GROUP BY 
        produtos_cesta.cod_produtos_cesta, 
        produtos_cesta.sku, 
        produtos_cesta.unidades 
) 
AS tab_contagem
    ON (produtos_cesta.cod_produtos_cesta = tab_contagem.cod_produtos_cesta)
LEFT JOIN produtos_kits 
    ON (produtos.sku = produtos_kits.sku) 
LEFT JOIN produtos as produtos2
    ON (produtos_kits.sku_r = produtos2.sku) 
WHERE 
    shopper_id = '" + mscsShopperId + @"' 
GROUP BY 
    produtos_cesta.cod_produtos_cesta, 
    tab_contagem.cont,
    produtos_cesta.sku, 
    produtos_kits.sku_r, 
    produtos.cod_produtos_kits_tipo, 
    produtos2.estoque,
    produtos.controla_estoque, 
    produtos.estoque, 
    produtos.status, 
    produtos.nome_pequeno, 
    produtos_cesta.unidades, 
    produtos_cesta.quantidade,
    produtos_kits.quantidade
ORDER BY 
    produtos_cesta.sku, 
    produtos_cesta.unidades DESC
于 2010-08-21T01:01:51.607 に答える
5

上記のほとんどが戻り列名を並べたように、テーブル名と条件を並べると読みやすさが大幅に向上することがわかりました。

SELECT 
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN
    (
        SELECT TOP(1) 
            column4
        FROM 
            table2 INNER JOIN 
            table3 ON table2.column1 = table3.column1
    )

そして、結合条件が長くなったときのために。

SELECT
    Column1,
    Column2
FROM 
    Table1 JOIN 
    Table2 ON 
        Table1.Column3 = Table2.Column4 JOIN 
    Table3 ON 
        Table2.Column1 = Table3.Column1 and
        Table2.ColumnX = @x and
        Table3.ColumnY = @y
WHERE
    Condition1=xxx and
    Condition2=yyy and
    (
        Condition3=aaa or
        Condition4=bbb
    )
于 2012-03-28T15:04:37.873 に答える
5

これが私の突っ込みです:

select column1, column2
    from table1
    where (column3 in (
        select top(1) column4
            from table2
            inner join table3
                on (table2.column1 = table3.column1)
    ))
;
  • 小文字の方が読みやすいため (また、キーワードを強調するコードの強調表示があるため)、入力も簡単です。
  • キーワードのすべての制限またはオプション (select の from や join の on など) は、outward キーワードへの依存を示すためにインデントされています。
  • 閉じ括弧は、開き括弧と同じインデント レベルにあります。
  • where句とon句に括弧を使用して可読性を高めます
  • 複数のステートメントをより適切に区別できるように、同じインデントで select-statement をセミコロンで閉じます (SAS PROC SQL のように言語でセミコロンが必要な場合)。
  • それでも非常にコンパクトで、ページ全体に広がることはありません
于 2013-08-07T08:54:50.883 に答える
4

もちろん、これは個人的な好みに帰着します。また、チーム設定の場合、一貫性を保つためにメンバー間で合意する必要があります。しかし、これは私の好みです:

SELECT column1, column2
FROM   table1
WHERE  column3 IN(SELECT     TOP(1) column4
                  FROM       table2
                  INNER JOIN table3 ON
                             table2.column1 = table3.column1
                 )
于 2008-11-07T14:32:22.553 に答える
3

私は次のようにフォーマットします:

SELECT
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN (SELECT TOP(1) 
                    column4 
                FROM 
                    table2 
                    INNER JOIN table3 ON table2.column1 = table3.column1)

またはこのように:

SELECT
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN (SELECT TOP(1) column4 
                FROM table2 
                INNER JOIN table3 ON table2.column1 = table3.column1)
于 2008-11-07T14:34:04.077 に答える
2

もちろん、クエリによって異なります。

単純なクエリの場合、非常に正式なインデントスキームは、その価値よりも厄介であり、実際にコードを読みにくくする可能性があります。ただし、複雑さが増すにつれて、ステートメントの構造に注意を払い、後で再び読み取れるようにする必要があります。

于 2008-11-07T14:45:43.977 に答える
2

ええ、これはかなり主観的です...しかし、ここに私の2セントがあります:

SELECT
   Column1,
   Column2
FROM Table1
WHERE 
   Column3 IN (
      SELECT Column4
      FROM Table2
      JOIN Table3 ON
         Table2.Column1 = Table3.Column1
   )

しかし、実際には、おそらくINなしで書き直します。

SELECT
   Column1,
   Column2
FROM Table1
JOIN Table2 ON
   Table1.Column3 = Table2.Column4
JOIN Table3 ON
   Table2.Column1 = Table3.Column1

基本的に、私のルールは次のとおりです。

  • キーワードを大文字にする
  • 列は個々の行に配置されますが、SELECT修飾子(SELECT TOP 100、SELECT DISTINCTなど)または単一の列(SELECT 1、SELECT Id、SELECT *など)は同じ行に配置されます
  • JOIN句の下にインデントされた結合条件
  • JOINをINNERJOINに使用し(一般的なものであるため)、他のJOINを完全に指定します(LEFT OUTER JOIN、FULL OUTER JOINなど)。
  • 同じ行でパレンを開き、別の行でパレンを閉じます。エイリアスがある場合、エイリアスは密接な関係にあります。
于 2008-11-07T14:52:18.177 に答える
2

これは私の通常の好みです:

    SELECT column1
        ,column2
    FROM table1
    WHERE column3 IN (
        SELECT TOP(1) column4
        FROM table2
        INNER JOIN table3
            ON table2.column1 = table3.column1
    )
于 2008-11-07T14:41:26.997 に答える
2

SQLプリティファイアーに通したところ、このようになりました....

SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
    FROM table2
            INNER JOIN table3
            ON table2.column1 = table3.column1
)

http://extras.sqlservercentral.com/prettifier/prettifier.aspx

.....しかし、私は色を StackOverflow に取り込む方法を考え出していません。

于 2008-11-07T16:40:56.647 に答える
1
SELECT
    Column1,
    Column2
FROM
    Table1
WHERE
    Column3 IN
    (
        SELECT TOP (1)
            Column4
        FROM 
            Table2
        INNER JOIN 
            Table3
        ON
            Table2.Column1 = Table3.Column1
    )
于 2011-01-03T05:56:03.267 に答える
1

標準があるかどうかはわかりませんが、私はこのようにするのが好きです。

SELECT column1, column2
  FROM table1
WHERE column3 IN
(
    SELECT TOP(1) column4
      FROM table2
    INNER JOIN table3
      ON table2.column1 = table3.column1
)

SQLをよりよく読んで分析できるからです。

于 2008-11-07T14:34:11.723 に答える
0

これは好みの問題です。

これが私の好みです。

SELECT 
  column1
 ,column2
FROM
  table1
WHERE column3 IN (
                 SELECT TOP(1) column4
                 FROM 
                   table2
                   INNER JOIN table3
                 ON table2.column1 = table3.column1
                 )
于 2008-11-07T14:44:21.607 に答える
0

私が通常行っていることは、

print("SELECT column1, column2
       FROM table1
       WHERE column3 IN (SELECT TOP(1) column4
                         FROM table2 INNER JOIN 
                              table3 ON table2.column1 = table3.column1)");
于 2008-11-07T14:31:41.477 に答える
-4

ここでは次のようにします。

選択する
        COLUMN1、
        COLUMN2、
        COLUMN5 = 'X' の場合
                        と
                        COLUMN6 = 'Y'
                次に「1」
                COLUMN5 が (
                                「ああ」、
                                「BBB」
                        )
                次に「2」
                そうでなければ「3」
        COLUMN7 で終わる
から
        表1
どこ
        COLUMN2 in (
                トップを選択(1)
                        COLUMN4
                から
                        表2
                        内部結合
                        表3
                                の上
                                        TABLE2.COLUMN1 = TABLE3.COLUMN1
                                        と
                                        TABLE2.COLUMN2
                                                の間に
                                                        表3.列2
                                                        と
                                                        TABLE3.COLUMN3
        )

私たちの考えは、SQL キーワードを小文字にし、テーブルや列名などのすべての変化する (したがって「より興味深い」) ものを大文字にすることです。このコードは少し「大げさ」に見えるかもしれませんが、この例よりも長い名前 (スキーマなどを含む) の複雑なクエリがある場合は、読みやすくなります。そして: 「レベル」に従ってすべてのオブジェクトをインデントします。

于 2013-07-26T09:01:54.880 に答える