oracle 字段删除缩进,SQL语句缩进的好习惯

25 个答案:

答案 0 :(得分:40)

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

(

...

)

我在第一个例子中发现更容易,更快捷。希望这个例子能够向你展示我的观点。

答案 1 :(得分:24)

SELECT column1, column2

FROM table

WHERE column3 IN (

SELECT TOP(1) column4

FROM table2

INNER JOIN table3 ON table2.column1 = table3.column1

)

这很简短易读。如果选择了更多列或更多连接条件,我会进行调整。

答案 2 :(得分:21)

不确定是否有一种公认的做法,但现在我就是这样做的:

SELECT

column1,

column2

FROM

table1

WHERE

column3 IN

(

SELECT TOP(1)

column4

FROM

table2

INNER JOIN

table3

ON table2.column1 = table3.column1

)

答案 3 :(得分:20)

我喜欢在代码中拥有白色空间的“河流”。它使扫描更容易。

SELECT column1,

column2

FROM table1

WHERE column3 IN (SELECT column4

FROM table2

JOIN table3

ON table2.column1 = table3.column1);

答案 4 :(得分:17)

我喜欢jalbert在右边排列关键字的形式。我还补充一点,我喜欢左边的AND和OR(有些人把它们放在右边。)另外,我喜欢在可能的情况下排列我的等号。

SELECT column1,

column2

FROM table1, table2

WHERE table1.column1 = table2.column4

AND table1.col5 = "hi"

OR table2.myfield = 678

答案 5 :(得分:10)

这是我个人的方法。根据连接条件的长度,我有时会在下面的行中缩进它。

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

)

答案 6 :(得分:7)

我为我们的商店编写了一个代码标准,它极其偏向可读性/“可发现性”(后者主要用于插入选择语句):

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的最佳朋友。

答案 7 :(得分:7)

如果你有一个冗长的SQL语句,你想要重新格式化而没有所有的输入和标签,你可以将它打成this website并获得格式良好的结果。您可以尝试各种格式,以查看哪种格式使您的文字最具可读性。

编辑:我认为this是SQL格式化程序的2014位置。

答案 8 :(得分:6)

SQL格式是一个存在大量差异和分歧的领域......但是,我喜欢关注可读性并认为无论你做什么,始终如一地遵守任何降低可读性的规则,就像旧的一样陈词滥调,“愚蠢的一致性”(“愚蠢的一致性是简单思想的大人物”)

因此,这里有一些指导原则,而不是称它们为规则。

对于SQL语句中的每个Major子句(Select,Insert,Delete,From,Where,Having,Group BY,Order By,......我可能会遗漏一些)应该易于识别。所以我通常在最高级别缩进它们,所有这些都是相互的。然后在每个子句中,我均匀地缩进下一个逻辑子结构......依此类推......但是我觉得(并且经常会)改变模式,如果在任何个别情况下它会更可读...复杂案例陈述就是一个很好的例子。因为任何需要水平滚动的东西都会极大地降低可读性,所以我经常在多行上编写复杂(嵌套)Case表达式。当我这样做时,我会尝试根据它在SQL语句中的逻辑位置来保持这样一个语句的开头,并将其余的语句行缩进几个字符...

SQL数据库代码已经存在了很长时间,因为在计算机具有小写的情况之前,所以对于大写字母关键字存在历史偏好,但我更喜欢可读性而不是传统...(并且我使用的每个工具都使用颜色代码现在无论如何关键词)

我也会使用表别名来减少眼睛必须扫描的文本量,以便了解查询的结构,只要别名不会造成混淆。在一个少于3或4个表的查询中,单个字符别名很好,如果所有的表都以不同的字母开头,我经常使用表的第一个字母...再次,无论最有助于可读性。最后,如果您的数据库支持它,许多关键字是可选的(如“内部”,“外部”,“作为”别名等)。“进入”(来自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子句上有更多的列,我会缩进第二行和后续行......我通常不遵守任何严格(每行一列)的规则,因为veritcally滚动几乎与可读性差一样因为水平滚动,特别是如果只有屏幕的前十列中有任何文本)

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)

以任何方式格式化代码,使其最具可读性......

答案 9 :(得分: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

)

答案 10 :(得分: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

)

答案 11 :(得分: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

答案 12 :(得分:5)

这是我的捅:

select column1, column2

from table1

where (column3 in (

select top(1) column4

from table2

inner join table3

on (table2.column1 = table3.column1)

))

;

一切都是小写的,因为它更容易阅读小写字符(我们有代码突出显示以强调关键字)也更容易输入

关键字的每个限制或选项(如选择中的from或连接上的on)都缩进以显示它们对向外关键字的依赖性

结束支架与处的开口处于同一凹痕水平

使用括号表示where-and--clause以提高可读性

使分号在同一缩进处关闭select语句,以便更好地区分多个语句(如果您需要使用SAS PROC SQL等语言的分号)

它仍然非常紧凑,不会遍布整个页面

答案 13 :(得分:4)

当然,这取决于个人喜好。如果在团队环境中,为了一致性,应该在成员之间达成一致意见。但这是我的偏好:

SELECT column1, column2

FROM table1

WHERE column3 IN(SELECT TOP(1) column4

FROM table2

INNER JOIN table3 ON

table2.column1 = table3.column1

)

答案 14 :(得分: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)

答案 15 :(得分:2)

我刚刚通过我的SQL预处理器,它就像这样....

SELECT column1, column2

FROM table1

WHERE column3 IN

(

SELECT TOP(1) column4

FROM table2

INNER JOIN table3

ON table2.column1 = table3.column1

)

.....但我还没有找到一种方法让颜色进入StackOverflow。

答案 16 :(得分:2)

这是我的正常偏好:

....SELECT column1

........,column2

....FROM table1

....WHERE column3 IN (

........SELECT TOP(1) column4

........FROM table2

........INNER JOIN table3

............ON table2.column1 = table3.column1

....)

虽然stackoverflow会使用额外的前导空格来混淆格式,所以我放入了一段时间,以便您可以看到实际的格式...

答案 17 :(得分:2)

答案 18 :(得分: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进行INNER JOIN(因为它是常用的),并完全指定其他(LEFT OUTER JOIN,FULL OUTER JOIN等)

在同一条线上打开parens,在另一条线上关闭paren。如果你有一个别名,别名就是关闭paren。

答案 19 :(得分:1)

我不知道是否有标准,但我喜欢这样做;

SELECT column1, column2

FROM table1

WHERE column3 IN

(

SELECT TOP(1) column4

FROM table2

INNER JOIN table3

ON table2.column1 = table3.column1

)

因为我可以更好地阅读和分析SQL。

答案 20 :(得分:1)

嗯,当然这取决于查询。

对于简单查询,高度正式的缩进方案比它的价值更麻烦,实际上可以使代码更少可读,而不是更多。但随着复杂性的增长,你需要开始更加谨慎地构建语句,以确保它在以后再次可读。

答案 21 :(得分:1)

SELECT

Column1,

Column2

FROM

Table1

WHERE

Column3 IN

(

SELECT TOP (1)

Column4

FROM

Table2

INNER JOIN

Table3

ON

Table2.Column1 = Table3.Column1

)

答案 22 :(得分:0)

我通常做的是,

print("SELECT column1, column2

FROM table1

WHERE column3 IN (SELECT TOP(1) column4

FROM table2 INNER JOIN

table3 ON table2.column1 = table3.column1)");

答案 23 :(得分:0)

这是一个品味问题。

这是我的偏好。

SELECT

column1

,column2

FROM

table1

WHERE column3 IN (

SELECT TOP(1) column4

FROM

table2

INNER JOIN table3

ON table2.column1 = table3.column1

)

答案 24 :(得分:-3)

我们就是这样做的:

select

COLUMN1,

COLUMN2,

case when COLUMN5 = 'X'

and

COLUMN6 = 'Y'

then 'one'

when COLUMN5 in (

'AAA',

'BBB'

)

then 'two'

else 'three'

end as COLUMN7

from

TABLE1

where

COLUMN2 in (

select top(1)

COLUMN4

from

TABLE2

inner join

TABLE3

on

TABLE2.COLUMN1 = TABLE3.COLUMN1

and

TABLE2.COLUMN2

between

TABLE3.COLUMN2

and

TABLE3.COLUMN3

)

我们的想法是:将sql关键字保持为小写,并将所有更改(因此更“有趣”)的内容放在表格或列名称中。

这里的代码可能看起来有点“爆炸”,但是如果你有比名称更长的复杂查询(包括模式等),它会增加可读性。

并且:根据“级别”缩进所有对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值