powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Форматирование инструкций ANSI/ISO SQL
28 сообщений из 28, показаны все 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
Форматирование инструкций ANSI/ISO SQL
    #38646646
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНу так кто из нас дурак и буквари не читает?
Ну давай посчитаем. Ты выдвинул очевидно неверное утверждение. Когда тебе на это указали, вместо того, чтобы проверить свои знания, ты полез спорить вслепую. Выяснилось, что выбранный тобой "свой" сервер ты знаешь хуже, чем я знаю чужой. Вместо того, чтобы поблагодарить за науку или просто тихо слинять, ты выражаешь отчётливое желание и дальше впечатываться мордой в батарею. Перечисленного более чем достаточно, чтобы ты сам мог ответить на свой вопрос.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38646673
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВыяснилось, что выбранный тобой "свой" сервер ты знаешь хуже, чем я знаю чужой.
Нездоровая логика. Ты знаешь то что когда-то было и давно не поддерживается. Я не знаю того что нет в букварях по моему серверу - это вполне логично.

Если бы мы были на форуме по ораклу (или хотя бы оракл был упомянут), то ты был бы прав, а тут получается просто хамишь без каких-либо доказательств. То что я не работал с ораклом я сразу написал. Так что следи за словами и проблем не будет. Мир.
...
Рейтинг: 0 / 0
Форматирование инструкций ANSI/ISO SQL
    #38647197
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Господа, завязываем с выяснением длины.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Форматирование инструкций ANSI/ISO SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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