powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Форматирование инструкций ANSI/ISO SQL
25 сообщений из 28, страница 1 из 2
Форматирование инструкций ANSI/ISO SQL
    #38645992
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята всем привет!
Последнее время пришлось работать с чужими инструкциями sql, насмотрелся различных вариантов форматирования.
Хотел задать пару вопросов по форматированию, для того, что бы пересмотреть свое отношение к форматированию.
1. Есть простая инструкция:
Код: sql
1.
SELECT FK FROM Table WHERE PK=...


Я даже такие инструкции, стараюсь оформлять по правилам, например если это подзапрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
         ... WHERE ...
                   IN (
                        SELECT
                                    FK
                        FROM
                                    Table
                        WHERE
                                    PK=...
                     )


То есть, каждое предложение с новой строки, с отступом.
Но вот, часто в чужих отчетах народ не парится и пишет все в одну строку
Код: sql
1.
... WHERE ... IN (SELECT FK FROM Table WHERE PK=...)


Мне кажется это неудобным, так как лучше делать по рекомендуемым правилам.
2. Особое внимание у меня к форматированию связок в предложении FROM
Мне удобнее оформлять связки через скобки, как это для меня это более наглядно
Например:
Код: sql
1.
... FROM (Table1 INNER JOIN Table2 ON Table1.PK=Table2.PK) LEFT JOIN Table3 ON Table1.PK=Table3.FK


Кроме того, явно оформлять в виде одной строки такие связки неудобно, возникает вопрос как более удобно разбить предложение FROM по строкам:
Код: sql
1.
2.
3.
4.
5.
... FROM 
           (
             Table1 INNER JOIN Table2 ON Table1.PK=Table2.PK
           ) 
              LEFT JOIN Table3 ON Table1.PK=Table3.FK


Получается как-то кривовато...
У кого какие будут мысли?
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646029
TempFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не париться!
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646031
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIМне удобнее оформлять связки через скобки, как это для меня это более наглядно
Например:
Код: sql
1.
... FROM (Table1 INNER JOIN Table2 ON Table1.PK=Table2.PK) LEFT JOIN Table3 ON Table1.PK=Table3.FK


Нездорово как-то выглядит со скобками. Да и нет смысла в скобках, SQL не гарантирует что джоины будут именно так происходить.
это тоже самое
Код: sql
1.
... FROM Table1 LEFT JOIN Table3 ON Table1.PK=Table3.FK INNER JOIN Table2 ON Table1.PK=Table2.PK



Что касается многострочной записи - от синтаксиса языка много зависит.
Например небольшие запросы к SQL серверу из фокса пишу в одну строку
Код: sql
1.
sqlexec(lnHandle, "SELECT FK FROM Table WHERE PK=" + str(lnId), "tresult")


нет смысла заморачиваться с форматированием если и так все понятно.
Но если строка большая получается, то лучше форматировать, опять же на фоксе:
Код: sql
1.
2.
3.
4.
5.
6.
7.
text to lcQuery texmerge noshow
SELECT ... 
     FROM Table1 LEFT JOIN Table3 ON Table1.PK=Table3.FK 
                 INNER JOIN Table2 ON Table1.PK=Table2.PK
     WHERE PK=<<lnId>>
endtext
sqlexec(lnHandle, lcQuery, "tresult")
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646053
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне в целом нравится как форматирует PL/SQL Developer (за маленькими исключениями).
Я в итоге пишу примерно так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select column1 + 123456,
       column2 || 'QWERTY',
       column3, count(*)
  from table1 t1,
       table2 t2
       left join table3 t3 on t2.col1 = t3.col1
                          and t2.col2 = t3.col3
 where t1.col4 = t2.col5
   and t2.col6 = t3.col7
   and t3.col8 = t1.col9 + t2.col10
   and (  expression1 = expression2
       or expression3 = expression4
       or expression5 = expression6)
 group by column1, column2, column3
having count(*) > 1
 order by column3 desc, column2, column1 desc

А еще я люблю писать все маленькими буквами (Тема Лебедев утверждает, что они читаются легче, и я скорее склонен с ним согласиться), и люблю делать настройки IDE с темным фоном.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646079
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TGeorge-IIIМне удобнее оформлять связки через скобки, как это для меня это более наглядно
Например:
Код: sql
1.
... FROM (Table1 INNER JOIN Table2 ON Table1.PK=Table2.PK) LEFT JOIN Table3 ON Table1.PK=Table3.FK



Нездорово как-то выглядит со скобками. Да и нет смысла в скобках, SQL не гарантирует что джоины будут именно так происходить.
это тоже самое
Код: sql
1.
... FROM Table1 LEFT JOIN Table3 ON Table1.PK=Table3.FK INNER JOIN Table2 ON Table1.PK=Table2.PK




Что касается многострочной записи - от синтаксиса языка много зависит.
Например небольшие запросы к SQL серверу из фокса пишу в одну строку
Код: sql
1.
sqlexec(lnHandle, "SELECT FK FROM Table WHERE PK=" + str(lnId), "tresult")



нет смысла заморачиваться с форматированием если и так все понятно.
Но если строка большая получается, то лучше форматировать, опять же на фоксе:
Код: sql
1.
2.
3.
4.
5.
6.
7.
text to lcQuery texmerge noshow
SELECT ... 
     FROM Table1 LEFT JOIN Table3 ON Table1.PK=Table3.FK 
                 INNER JOIN Table2 ON Table1.PK=Table2.PK
     WHERE PK=<<lnId>>
endtext
sqlexec(lnHandle, lcQuery, "tresult")


нет, вот как раз со скобками для меня удобнее, здесь вопрос не в том, как будет выполняться объединение, а в наглядности, даже как-то логичности построения конструкции.

а вот в ниженем регистре зарезервированные слова мне не нравится писать, сливается с названием полей и столбцов.
Код: sql
1.
select top 10 column1 from table;


а вот так как-то нагляднее
Код: sql
1.
SELECT TOP 10 column1 FROM table;
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646181
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIЯ даже такие инструкции, стараюсь оформлять по правилам, например если это подзапрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
         ... WHERE ...
                   IN (
                        SELECT
                                    FK
                        FROM
                                    Table
                        WHERE
                                    PK=...
                     )


Дальше можно не продолжать. Если некие правила заставляют писать в девять строк то, что комфортно пишется в одну - значит, им место в помойке. Просто посмотрите на следующий фрагмент кода, поймите его смысл и оцените, насколько он станет хорошо и удобно читаемым, если его таким образом раздуть в десять раз:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
....
from
  table t
where
  exists (select 1 from table_1 tt where tt.id = t.id) and
  exists (select 1 from table_2 tt where tt.id = t.id) and
  exists (select 1 from table_3 tt where tt.id = t.id) and
  exists (select 1 from table_4 tt where tt.id = t.id) and
  exists (select 1 from table_5 tt where tt.id = t.id) and
  exists (select 1 from table_6 tt where tt.id = t.id) and
  exists (select 1 from table_7 tt where tt.id = t.id) and
  exists (select 1 from table_8 tt where tt.id = t.id) and
  exists (select 1 from table_9 tt where tt.id = t.id) and
  exists (select 1 from table_10 tt where tt.id = t.id)



Особенно оцените влияние на читабельность, если перед одним-двумя exists добавить not - вот на спор, найдётся ли хотя бы 10% разработчиков, которые в "отформатированном Вами" варианте увидят это с первого раза.

George-IIIМне кажется это неудобным, так как лучше делать по рекомендуемым правилам.
"Лучше по правилам" - это заведомо проигрышный аргумент. Запомните: правила должны соответствовать потребностям, а не наоборот, потребности запихиваться в прокрустово ложе правил. Если какая-то удобная и разумная вещь не укладывается в правила - значит, правила должны быть доработаны.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646219
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Может быть, но в приведенном вами варианте длина строки небольшая, может это и разумно, а вот если бы длина подзапроса не уменьшалась бы на одном экране, то логичее все же оформить каждое предложение на новой строке.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646273
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIв приведенном вами варианте длина строки небольшая, может это и разумно, а вот если бы длина подзапроса
Правильно, в точку. Если подзапрос длиной сорок-пятьдесят символов, его разумно писать в одну строку. Если подзапрос длиной четыреста-пятьсот символов, его разумно писать с многострочным форматированием. Если подзапрос длиной в четыре-пять тысяч символов, его разумно выносить в CTE или в отдельное view или куда-то ещё. Попытка придумать одно безусловное правило для подзапросов в сорок символов и в четыре тысячи символов - идиотизм.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646347
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть, но с другой стороны - это общий стиль исходного текста запроса, а то получается, где-то многострочный вариант, а где-то всё в одну строку... Это несколько коробит глаза, когда смотришь большие запросы.

я бы вот за это бы руки отрывал:
Код: sql
1.
2.
3.
select column1,column2,column3,column4
from table1,table2,table3,table4
where table1.pk=table2.fk and table2.tk=table3.pk and table4.pk=table1.fk and table1.numcolumn is null and table3.keynum=5



и представьте такой бред длиной с километр... как такой запрос можно анализировать?
или по принципу: Заработал и фиг с ним... а кому надо - разберется
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646453
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIя бы вот за это бы руки отрывал:
Код: sql
1.
2.
3.
select column1,column2,column3,column4
from table1,table2,table3,table4
where table1.pk=table2.fk and table2.tk=table3.pk and table4.pk=table1.fk and table1.numcolumn is null and table3.keynum=5


Если не ошибаюсь - это в оракле так любят писать
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646457
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Угу, так и есть, я вот счетаю, что через join связки как-то более наглядно видны
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646479
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIDima T,

Угу, так и есть, я вот счетаю, что через join связки как-то более наглядно видны
+1
кроме того это inner join, а left join так не сделать.
С ораклом не работал, но подозреваю что не с проста это, наверно зачем-то это было надо, может оптимизатор оракла на такие запросы лучше заточен.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646500
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIя бы вот за это бы руки отрывал:
Если Вы имеете в виду "короткая широкая простыня в минимум строчек", то тут основной вопрос - какое значение имеет этот запрос. Если это "основной объект", достаточно сложный запрос, то такое форматирование, конечно, недопустимо. В то же время бывает, что в коде ХП встречается довольно тривиальный запрос, про который надо понимать, что "он возвращает X и Y и всё" - детали малоинтересны и вообще основной смысл ХП совсем в другом, тогда такое форматирование можно как-то обосновать.

Если же Вы имеете в виду стиль соединения таблиц в where, то его использование либо отрицание - вопрос привычки. В простых случаях, коих подавляющее большинство, разработчик, видя список таблиц и их алиасы, уже знает, как они соединены, и на условия соединения вообще не смотрит. В целом join-синтаксис несколько выигрывает с точки зрения визуального выделения "фильтров" и в запросах со сложной структурой outer join-ов, но проигрывает в наглядности всякого рода смешанных и нетривиальных соединений. В целом, повторюсь - дело привычки, кого на что "подсадили", то правильным и считает.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646502
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tкроме того это inner join, а left join так не сделать.
Вы бы букварь, что ли, почитали, прежде чем пургу нести.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646503
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TGeorge-IIIDima T,

Угу, так и есть, я вот счетаю, что через join связки как-то более наглядно видны
+1
кроме того это inner join, а left join так не сделать.
С ораклом не работал, но подозреваю что не с проста это, наверно зачем-то это было надо, может оптимизатор оракла на такие запросы лучше заточен.
Да нет, left join и right join сделать без проблем
Код: sql
1.
where pk=fk(+)

- right outer join
Код: sql
1.
where pk(+)=fk

- left outer join

сложнее c full join...
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646511
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIDima Tпропущено...

+1
кроме того это inner join, а left join так не сделать.
С ораклом не работал, но подозреваю что не с проста это, наверно зачем-то это было надо, может оптимизатор оракла на такие запросы лучше заточен.
Да нет, left join и right join сделать без проблем
Код: sql
1.
where pk=fk(+)


- right outer join
Код: sql
1.
where pk(+)=fk


- left outer join

сложнее c full join...
наборот только, :) поторопился, знаком (+) помечается таблица которую надо "расширить" null значениями
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646521
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerGeorge-IIIя бы вот за это бы руки отрывал:
Если Вы имеете в виду "короткая широкая простыня в минимум строчек", то тут основной вопрос - какое значение имеет этот запрос. Если это "основной объект", достаточно сложный запрос, то такое форматирование, конечно, недопустимо. В то же время бывает, что в коде ХП встречается довольно тривиальный запрос, про который надо понимать, что "он возвращает X и Y и всё" - детали малоинтересны и вообще основной смысл ХП совсем в другом, тогда такое форматирование можно как-то обосновать.

Если же Вы имеете в виду стиль соединения таблиц в where, то его использование либо отрицание - вопрос привычки. В простых случаях, коих подавляющее большинство, разработчик, видя список таблиц и их алиасы, уже знает, как они соединены, и на условия соединения вообще не смотрит. В целом join-синтаксис несколько выигрывает с точки зрения визуального выделения "фильтров" и в запросах со сложной структурой outer join-ов, но проигрывает в наглядности всякого рода смешанных и нетривиальных соединений. В целом, повторюсь - дело привычки, кого на что "подсадили", то правильным и считает.
нет, я имел в виду не методы формирования внутреннего или внешних объединений, а именно "короткая и широкая простыня" :).
Я расцениваю это как халатное отношение к своим задачам и неуважение к разработчикам, которые, возможно, будут анализировать и рефакторить твое творение
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646532
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerDima Tкроме того это inner join, а left join так не сделать.
Вы бы букварь, что ли, почитали, прежде чем пургу нести.
Ну ткни тогда меня в букварь по MS SQL, почитаю. Там я подобного не встречал. Или в стандарт SQL. Буквари по ораклу не интересны. Тут не оракловый форум.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646535
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIнет, я имел в виду не методы формирования внутреннего или внешних объединений, а именно "короткая и широкая простыня" :).
Я расцениваю это как халатное отношение к своим задачам и неуважение к разработчикам, которые, возможно, будут анализировать и рефакторить твое творение
Скажу так: у меня здесь не будет претензий, если такой запрос влезает на экран без скроллинга и действительно не превосходит несколько строчек. Пример:

Код: plsql
1.
2.
3.
4.
select a, b, c, d, e, f, g 
  into :a, :b, :c, :d, :e, :f, :g
  from table
  where id = :id


я однозначно предпочту не разворачивать по вертикали.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646548
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНу ткни тогда меня в букварь по MS SQL, почитаю. Там я подобного не встречал. Или в стандарт SQL. Буквари по ораклу не интересны. Тут не оракловый форум.
Ну и дурак, что не встречал. Гугли по чему-нибудь вроде "mssql *= operator".
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646549
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tsoftwarerпропущено...

Вы бы букварь, что ли, почитали, прежде чем пургу нести.
Ну ткни тогда меня в букварь по MS SQL, почитаю. Там я подобного не встречал. Или в стандарт SQL. Буквари по ораклу не интересны. Тут не оракловый форум.
там вроде так:
where t1.pk(*)=t2.fk
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646557
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIDima Tпропущено...

Ну ткни тогда меня в букварь по MS SQL, почитаю. Там я подобного не встречал. Или в стандарт SQL. Буквари по ораклу не интересны. Тут не оракловый форум.
там вроде так:
where t1.pk(*)=t2.fk

или без скобок, вроде :)

where t1.pk*=t2.fk
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646560
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIтам вроде так:
where t1.pk(*)=t2.fk
Ошибка Incorrect syntax near '*'.
с (+) тоже самое.

Нету такого в MS SQL. Я прав softwarer?
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646567
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TGeorge-IIIтам вроде так:
where t1.pk(*)=t2.fk
Ошибка Incorrect syntax near '*'.
с (+) тоже самое.

Нету такого в MS SQL. Я прав softwarer?

Без скобок должно работать, я давно MS SQL Server не использовал, да и внешних объединений в предложении WHERE никогда не пробовал делать, там вроде уже с 6 версии ANSI синтаксис поддерживался, а вот в Oracle, только вроде с 8.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646611
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerDima TНу ткни тогда меня в букварь по MS SQL, почитаю. Там я подобного не встречал. Или в стандарт SQL. Буквари по ораклу не интересны. Тут не оракловый форум.
Ну и дурак, что не встречал. Гугли по чему-нибудь вроде "mssql *= operator".
нагуглил
http://technet.microsoft.com/en-us/library/ms177634(v=sql.90).aspx Remarks

The FROM clause supports the SQL-92-SQL syntax for joined tables and derived tables. SQL-92 syntax provides the INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, and CROSS join operators.
The outer join operators (*= and =*) are not supported when the compatibility level of the database is set to 90.
90 это MSSQL 2005, т.е. в нем уже этот синтаксис не поддерживается. У меня 2012, там compatibility ниже 90 вообще не выставляется.

Ну так кто из нас дурак и буквари не читает?
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Форматирование инструкций ANSI/ISO SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]