====== Некоторые особенности FireBird ====== === Активная работа с жестким диском === FireBird пишет в файл базы данных "по каждому чиху". Это связано с тем что FB не имеет журнала транзакций, в отличии от MS SQL. На современном оборудовании (SSD диски) это не оказывает никакого влияния. === Зацикливание === INSERT INTO TABLE1 SELECT * FROM TABLE1 В версии FireBird до 3 сработает и повесит его наглухо. Будьте внимательны === Транзакция по умолчанию - это SNAPSHOT === Если в транзакции READ COMMITED выполнить запрос SELECT * FROM TABLE1 из таблицы с большим числом записей и не спеша двигаться в конец таблицы, то мы запросто может встретить новые записи, добавленные в таблицу после выполнения указанного SELECT-запроса.\\ Таким образом, SELECT-запрос в рамках транзакции READ COMMITED не является "атомарным".Но кто сказал, что SELECT-запрос должен быть во всех случаях "атомарным"? В данном вопросе каждая СУБД поступает так, как считает правильным.\\ Для Firebird транзакция по умолчанию - это SNAPSHOT, и здесь SELECT-запрос является атомарным на 100%! === FIRST, SKIP и ROWS === //FIRST и SKIP используются только в Firebird, они не включены в стандарт SQL. Рекомендуется использовать ROWS везде, где это возможно.// \\ \\ Выражение FIRST <число записей> ограничивает результирующий набор данным указанным числом записей.\\ Выражение SKIP <число записей> пропускает указанное число записей перед выдачей результирующего набора данных.\\ Когда эти выражения используются совместно, например FIRST m SKIP n, то в результате n записей будет пропущено и, из оставшихся, m записей будет возвращено в результирующем наборе данных.\\ FIRST и SKIP являются необязательными выражениями\\ \\ Синтаксис:\\ SELECT [FIRST ] [SKIP ] FROM ... ... , ::= integer literal | query parameter | (integer-expression) или\\ SELECT ... FROM ... ... ROWS m [TO n] m, n ::= integer-expression \\ **Типичные ошибки**\\ \\ 1. Пытаемся удалить первые 10 записей\\ DELETE FROM MYTABLE WHERE ID IN (SELECT FIRST 10 ID FROM MYTABLE) В итоге получим пустую таблицу. Подзапрос будет выбирать каждый раз по 10 записей и они будут удаляться\\ \\ 2.В некоторых случаях IN=EXISTS \\ WHERE F1 IN (SELECT FIRST 5 F2 FROM TABLE2 ORDER BY 1 DESC) = WHERE EXISTS (SELECT * F2 FROM TABLE2 WHERE TABLE2.F2 = TABLE1.F2 ORDER BY 1 DESC) === Order by 1,2,3,4 === В конструкцию **Order by** и **Group by** вместо названия полей в сортировке можно подставлять их порядковый номер. Не не забывайте, чем больше полей в запросе тем труднее потом искать. select id, name, adress, inn from table1 order by 1,2,4 === Объединение значений в строку === В стандарте T-SQL для объединения текстовых строковых аргументов используется функция CONCAT, в FierBird используется две вертикальные черты || select name||' '||adress from table 1 Результат Имя Адрес Значение может быть текстовым, числовым или датой. Но с датой будут свои особенности\\ {{:pasted:20220401-172318.png}} например нам нужно вывести дату когда был оформлен выезд и адрес склада в одном поле. select mp.dttm||' '||mp.address from mobile_plan mp результат будет таким:\\ {{:pasted:20220401-172534.png}}