По вашему выходит, что все великие географические открытия прошлого делались психами? Или вы считаете, что Колумб, например, совершал свое путешествие имея 100% гарантию успешного возвращения?
А все космические корабли «поколений» из фантастических романов тоже комплектовались исключительно психами? Да и авторы этих романов тоже психи, раз такую ересь придумали?
Я же думаю что экспедиция в один конец без проблем будет укомплектована экипажем из адекватных специалистов.
Вопрос: почему надо доливать только воду?
Вы же сами пишите:
Газообразные водород и кислород могут увлекать за собой капельки электролита, создавая аэрозоль серной кислоты.
Следовательно, кислота тоже может испаряться.
Имхо, правильная рекомендация:
Надо доливать воду, контролируя плотность электролита. При необходимости долить серную кислоту.
Разница в том, что алиас не бессмысленная буковка i или a, а говорящее название: Invoices — все счета, Invoice — один счет InvoicesOld — некие старые счета
И я, смотря на любое место многостраничного запроса, могу сразу понять о чем речь, без необходимости прыгать к столбику алиасов в предложении FROM.
В-третьих, alias (псевдоним) на то и псевдоним, чтобы использовать его на своё усмотрение для повышения читаемости кода.
Хотя бы один пример повышения ЧИТАЕМОСТИ можно? Ваша метода способствует лишь скорости набора кода. А читаемость вы пытаетесь повысить экзотическим форматированием кода.
Ссылка на technet лишь подтверждает мое мнение о распространенном заблуждении.
ну не знаю… Ради редкого изучения кода жертвовать удобством работы с данными… У меня были случаи, когда я менял порядок полей в таблице/виде, только потому, что их неудобно было просматривать (важные поля находились не рядом или вылезали за границы экрана).
Хороший инструмент просмотра БД спасает иногда, но не всегда он есть под рукой.
А про алиасы… Извините, но однобуквенные алиасы это ужас. У меня они осмысленные и всегда одинаковые для таблиц с одинаковыми сущностями (за исключением суффикса, в случае множественного присоединения). Поэтому и смысла вычленения алиасов глазами нет никакого.
В обычном коде у меня EXCEPT вообще ни разу не встречается. Но как без него жить при отладке??? Например, поменяли процедуру загрузки данных. Надо убедиться, что все корректно. Копируем существующую таблицу под другим именем, по новой грузим данные и сравниваем через вышеупомянутый прием, что процедура работает правильно, данные совпадают.
Или есть два сервера/две БД, надо убедиться, что данные совпадают:
SELECT * FROM serverA.DBname.dbo.TableX
EXCEPT
SELECT * FROM serverB.DBname.dbo.TableX
на mssql прекрасно работает и выручает постоянно...
и т.д. Причина: легче делать рефакторинг, т.к. можно менять строки местами и их копипастить без удаления ключевых слов. Ну и джоины отбиваю отступом — но это на любителя:
FROM
Clients a
LEFT JOIN Products_view b
ON a.ProductID = b.ProductID
LEFT JOIN Managers c
ON a.ManagerID = c.ManagerID
Ну и пункт 5 мне совершенно не понятен. Поля располагаю так, что бы было удобно изучать результат. Например, код в таблице фактов и его описание из справочника будут идти подряд, несмотря на то, что они из разных таблиц.
Серьезно? Ну напишите FULL JOIN для таблицы хотя бы с 10-ю NULLable полями (f0,....,f9), выдающий аналогичный EXCEPTу результат. А финт с EXCEPT прекрасно работает на любом количестве полей и без утомительных проверок NULL/не NULL.
Двойные кавычки и квадратные скобки это стандартный способ для ограничения идентификаторов (а точнее, квадратные скобки стандартны только для mssql). Одинарные же кавычки в алиасе — видимо работают только там, по некому недоразумению.
Сравните:
CREATE TABLE "Тестовая таблица" (id INT)
DROP TABLE "Тестовая таблица"
и
CREATE TABLE 'Тестовая таблица' (id INT)
DROP TABLE 'Тестовая таблица'
Ну неужели никто не играет в Rocks'n'Diamonds? (https://www.artsoft.org/).
А к нему over 9000 уровней Сокобана, Супаплекса, Змееек и прочая и прочая… (уровни брать тут http://www.artsoft.org/rocksndiamonds/levels.html)
Я сейчас набор уровней Snake Bite прохожу — очень неплохо.
Разумеется, только на работу ламп накаливания даже сильный нагрев никакого влияния не оказывает. А электроника диодных ламп от нагрева стремительно дохнет.
Функция ISNULL преобразует к наименьшему типу из двух операндов. COALESCE преобразует к наибольшему типу.
ISNULL преобразует к типу первого операнда.
ISNULL позволяет сбросить признак nullable с колонки (бывает нужно при создании видов или временных таблиц).
COALESCE позволяет указывать много аргументов.
Добавление в копилку полезных приемов:
Создавать временные таблицы желательно без явного указания типов, путем копирования типов нужных полей из таблиц с которыми собираемся в дальнейшем работать. Например:
SELECT e.BusinessEntityID
, p.FirstName
, p.MiddleName
, p.LastName
INTO #TmpTable
FROM HumanResources.Employee e
JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID
WHERE 0=1
Получаем пустую временную таблицу с колонками нужных типов. И, если в будущем размерность какого-либо поля изменится, код переписывать не придется.
Хинт1. конструкт NULLIF(column,column) as column позволяет писать в колонку временной таблицы NULL, даже если в исходной NULL не допустим.
Хинт2. конструкт column+0 AS column позволяет снять признак IDENTITY с колонки
Или вы думаете, что людям заняться больше нечем, кроме как заменой всех светильников в доме, каждый раз когда меняется принцип действия лампы?
А все космические корабли «поколений» из фантастических романов тоже комплектовались исключительно психами? Да и авторы этих романов тоже психи, раз такую ересь придумали?
Я же думаю что экспедиция в один конец без проблем будет укомплектована экипажем из адекватных специалистов.
И, если электролит совсем не нужно доливать, то зачем он продается?
Вы же сами пишите:
Следовательно, кислота тоже может испаряться.
Имхо, правильная рекомендация:
Надо доливать воду, контролируя плотность электролита. При необходимости долить серную кислоту.
При высоте конуса в 30 см? Это как?
Разница в том, что алиас не бессмысленная буковка
i
илиa
, а говорящее название:Invoices
— все счета,Invoice
— один счетInvoicesOld
— некие старые счетаИ я, смотря на любое место многостраничного запроса, могу сразу понять о чем речь, без необходимости прыгать к столбику алиасов в предложении
FROM
.Хотя бы один пример повышения ЧИТАЕМОСТИ можно? Ваша метода способствует лишь скорости набора кода. А читаемость вы пытаетесь повысить экзотическим форматированием кода.
Ссылка на technet лишь подтверждает мое мнение о распространенном заблуждении.
У вас распространенное заблуждение, что алиасы это сокращенное название. Тогда как алиас (ИМХО) это смысловое название выборки.
Например:
но
или
Вот это реально помогает понимать код (а не буквы в столбик).
ну не знаю… Ради редкого изучения кода жертвовать удобством работы с данными… У меня были случаи, когда я менял порядок полей в таблице/виде, только потому, что их неудобно было просматривать (важные поля находились не рядом или вылезали за границы экрана).
Хороший инструмент просмотра БД спасает иногда, но не всегда он есть под рукой.
А про алиасы… Извините, но однобуквенные алиасы это ужас. У меня они осмысленные и всегда одинаковые для таблиц с одинаковыми сущностями (за исключением суффикса, в случае множественного присоединения). Поэтому и смысла вычленения алиасов глазами нет никакого.
В обычном коде у меня
EXCEPT
вообще ни разу не встречается. Но как без него жить при отладке??? Например, поменяли процедуру загрузки данных. Надо убедиться, что все корректно. Копируем существующую таблицу под другим именем, по новой грузим данные и сравниваем через вышеупомянутый прием, что процедура работает правильно, данные совпадают.Или есть два сервера/две БД, надо убедиться, что данные совпадают:
на mssql прекрасно работает и выручает постоянно...
Я всегда пишу смысловую часть на отдельных строчках от ключевых слов
SELECT
,FROM
,WHERE
,ORDER BY
,GROUP BY
:и т.д. Причина: легче делать рефакторинг, т.к. можно менять строки местами и их копипастить без удаления ключевых слов. Ну и джоины отбиваю отступом — но это на любителя:
Ну и пункт 5 мне совершенно не понятен. Поля располагаю так, что бы было удобно изучать результат. Например, код в таблице фактов и его описание из справочника будут идти подряд, несмотря на то, что они из разных таблиц.
Серьезно? Ну напишите
FULL JOIN
для таблицы хотя бы с 10-ю NULLable полями (f0
,....,f9
), выдающий аналогичный EXCEPTу результат. А финт с EXCEPT прекрасно работает на любом количестве полей и без утомительных проверок NULL/не NULL.Касательно
EXCEPT
:К сожалению нет стандартного ПРОСТОГО способа найти разницу двух таблиц одинаковой структуры
Table1
иTable2
.Приходится писать или
или заморачиваться с
FULL JOIN
.Двойные кавычки и квадратные скобки это стандартный способ для ограничения идентификаторов (а точнее, квадратные скобки стандартны только для mssql). Одинарные же кавычки в алиасе — видимо работают только там, по некому недоразумению.
Сравните:
и
А к нему over 9000 уровней Сокобана, Супаплекса, Змееек и прочая и прочая… (уровни брать тут http://www.artsoft.org/rocksndiamonds/levels.html)
Я сейчас набор уровней Snake Bite прохожу — очень неплохо.
ISNULL преобразует к типу первого операнда.
ISNULL позволяет сбросить признак nullable с колонки (бывает нужно при создании видов или временных таблиц).
COALESCE позволяет указывать много аргументов.
Добавление в копилку полезных приемов:
Создавать временные таблицы желательно без явного указания типов, путем копирования типов нужных полей из таблиц с которыми собираемся в дальнейшем работать. Например:
SELECT e.BusinessEntityID
, p.FirstName
, p.MiddleName
, p.LastName
INTO #TmpTable
FROM HumanResources.Employee e
JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID
WHERE 0=1
Получаем пустую временную таблицу с колонками нужных типов. И, если в будущем размерность какого-либо поля изменится, код переписывать не придется.
Хинт1. конструкт NULLIF(column,column) as column позволяет писать в колонку временной таблицы NULL, даже если в исходной NULL не допустим.
Хинт2. конструкт column+0 AS column позволяет снять признак IDENTITY с колонки