SQLステートメントをインデントするための一般的な方法は何ですか?たとえば、次のSQLステートメントを考えます。
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
)
すべての"、"前にが必要です。この方法では、SQLエディターから行Xでエラーが発生したときにそれらを検索することはありません。
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
(
...
)
最初の例では、より簡単かつ迅速に見つかりました。この例が私の視点をもっと示してくれることを願っています。
SELECT column1, column2
FROM table
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
)
コード内に空白の「川」があるのが好きです。スキャンが少し簡単になります。
SELECT column1,
column2
FROM table1
WHERE column3 IN (SELECT column4
FROM table2
JOIN table3
ON table2.column1 = table3.column1);
右側のキーワードを並べるjalbertの形式が好きです。また、左側のANDとORが好きだということも付け加えます(一部の人は右側に配置します)。さらに、可能な場合は等号を並べたいと思います。
SELECT column1,
column2
FROM table1, table2
WHERE table1.column1 = table2.column4
AND table1.col5 = "hi"
OR table2.myfield = 678
これは私の個人的な方法です。結合条件の長さに応じて、下の行でインデントすることがあります。
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
)
私は、読みやすさ/「発見可能性」(後者は主にinsert-selectステートメントで有用です)に極端に偏った、当店のコード標準を書きました。
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の親友であることが私の経験でした。
SQLの書式設定は、多くの相違点と意見の相違がある領域です...しかし、私は読みやすさに焦点を当て、読みやすさを低下させる規則に一貫して準拠することは、古い決まり文句が言うように、 「愚かな一貫性」(「愚かな一貫性は単純な心のためのホブゴブリン」)
したがって、それらをルールと呼ぶ代わりに、いくつかのガイドラインがあります。 SQLステートメントの各Major句(Select、Insert、Delete、From、Where、Having、Group BY、Order Byなど)を簡単に識別できる必要があります。それで、私は一般的にそれらを互いに最高レベルでインデントします。次に、各句内で、次の論理サブ構造を均等にインデントします...など。しかし、個々のケースで読みやすい場合は、パターンを自由に変更します(そして頻繁に変更します)。複雑なCaseステートメントが良い例です。水平スクロールを必要とするものはすべて読みやすさを大幅に低下させるため、複数行に複雑な(ネストされた)ケース式を記述することがよくあります。私がそうするとき、私はそのようなステートメントの始まりをSQLステートメントの論理的な場所に基づいてインデントをぶら下げて、残りのステートメント行を数文字インデントしてください...
SQL Databaseコードは、コンピューターが小文字になる前から長い間存在していたため、大文字のキーワードが歴史的に優先されますが、伝統より読みやすさを優先しています...とにかく)
また、エイリアスが混乱を引き起こさない限り、テーブルエイリアスを使用して、クエリの構造を理解するために目がスキャンする必要があるテキストの量を減らします。テーブルが3つまたは4つ未満のクエリでは、1文字のエイリアスは問題ありません。すべてのテーブルが異なる文字で始まる場合は、テーブルの最初の文字を使用します。最後に、データベースでサポートされている場合、キーワードの多くはオプションです(エイリアスの「Inner」、「Outer」、「As」など)。SQLServerでは「Into」(Insert Intoから)はオプションですが、 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)
最も読みやすい方法でコードをフォーマットします...
上記のほとんどが戻り列名を並べているので、表の名前と条件を並べると読みやすくなります。
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
)
クエリのさまざまな部分を縦に並べるのが好きです。 SQLには8スペースのタブサイズを使用する傾向がありますが、これはうまくいくようです。
SELECT column1,
column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)
非常に非常に複雑な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
これに私の突っ込みがあります:
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
)
私はこのようにフォーマットします:
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)
私は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に色を取り込む方法を考え出していない。
これは私の通常の好みです:
....SELECT column1
........,column2
....FROM table1
....WHERE column3 IN (
........SELECT TOP(1) column4
........FROM table2
........INNER JOIN table3
............ON table2.column1 = table3.column1
....)
Stackoverflowは余分な先行スペースでフォーマットを台無しにしますが、実際のフォーマットを見ることができるようにいくつかの期間を置いています...
このリンクは私が見つけた最高のものです。 http://www.sqlinform.com/free_online_sw.html
ええ、これはかなり主観的です...しかし、ここに私の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 column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)
sQLをよりよく読んで分析できるからです。
もちろん、それはクエリに依存します。
単純なクエリの場合、非常に正式なインデントスキームは価値があるだけでなく、実際にコードをless読み取り可能にすることができます。しかし、複雑さが増すにつれて、ステートメントを後で読みやすくするために、ステートメントの構造をより慎重に始める必要があります。
SELECT
Column1,
Column2
FROM
Table1
WHERE
Column3 IN
(
SELECT TOP (1)
Column4
FROM
Table2
INNER JOIN
Table3
ON
Table2.Column1 = Table3.Column1
)
私が普段やっていることは
print("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
)