Веб-версияОткрыть в Telegram

Ветка⚡️ SQL-задача с опасным подвохом

5 сообщений · –
D
⚡️ SQL-задача с опасным подвохом Какой баланс получит аккаунт после выполнения запроса в PostgreSQL? CREATE TABLE accounts ( id int PRIMARY KEY, balance int ); CREATE TABLE operations ( account_id int, amount int ); INSERT INTO accounts VALUES (1, 100); INSERT INTO operations VALUES (1, 10), (1, 20); UPDATE accounts a SET balance = a.balance + o.amount FROM operations o WHERE o.account_id = a.id; Многие ответят 130, но PostgreSQL обновит строку только один раз. Результатом может стать 110 или 120. Если целевая строка соединяется с несколькими строками из FROM, PostgreSQL использует одну из них, но какую именно, не гарантируется. Правильный вариант: UPDATE accounts a SET balance = a.balance + x.total FROM ( SELECT account_id, SUM(amount) AS total FROM operations GROUP BY account_id ) x WHERE x.account_id = a.id; Теперь каждой строке accounts соответствует ровно одна строка источника, а баланс станет 130. #SQL #PostgreSQL #Database
17 · 2.2K ·
  1. К
    Звучит как камень в огород исключительно PG, попробуйте такой-же сценарий на MS SQL и будет тот-же результат. А вот ORA ругнется. В принципе подобными конструкциями без опыта лучше не пользоваться даже там, где они работают правильно - merge надежнее.
    1. A
      Not, is one experiment. Your responded is intuition, but the true is that is only clean space. 😅 This is possible to be correct in other software, for example: > I use to SQLlibrary in Cpp, is possible add new command and possibly one return. Formally it is combinations of SQL library + program. > If one program was builder with 10 library, the 11° that you find, not is understand. So, sql is: 10 library. (Remember, one "Application or Program in your device not is eternal")
  2. .
    Изначально очень странный подход так делать. Здесь ввести сохраняемое поле, в которое серверный слой будет записывать сумму через дельту и все. Напридумывали костылей то с естественно которые порождают проблемы
  3. N
    Да какие такие многие, ответят, что будет 130, если тут слишком очевидно, что никак не выйдет 130. Что за посты для вайбкодеров

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем