1. SQL / Говнокод #16870

    −860

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    SELECT 
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D1 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D1 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D2 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D2 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D3 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D3 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D4 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D4 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D5 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D5 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D6 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D6 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D7 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D7 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D8 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D8 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D9 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D9 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D10 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D10 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D11 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D11 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D12 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D12 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D13 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D13 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D14 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D14 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D15 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D15 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D16 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D16 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D17 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D17 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D18 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D18 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D19 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D19 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D20 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D20 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D21 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D21 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D22 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D22 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D23 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D23 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D24 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D24 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D25 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D25 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D26 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D26 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D27 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D27 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D28 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D28 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D29 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D29 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D30 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D30 = S_KODGR.K_KOD)) +
     iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D31 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D31 = S_KODGR.K_KOD)) AS H_ALL,
    GR.ID_GRAF
    FROM GRAF_RAB AS GR
    WHERE GR.GOD = 2014
    AND GR.K_T_GR = 1

    1) Говеная архитектура БД: В базе месяц лежит в одной таблице с полями D1, D2, D3 и т.д. Потому нельзя просто взять и одним запросом связать две таблицы, а приходится делать 31 подзапрос
    2) Говеня БД: используется access, который не может и шагу ступить без vba. В итоге функция nz, написанная на vba просто не видна OleDbDataAdapter-у и приходится использовать iif. И 31 подзапрос превращается в 62
    3) Надо получить значения из двух полей. 62 подзапроса превращаются в 124(Здесь только одно поле. В проекте код в 2 раза длиннее)

    Запостил: yrHeTaTeJlb, 17 Октября 2014

    Комментарии (43) RSS

    • >iif
      А то я и думаю что за диалект мелкософтовский. Прям как бейсиком запахло. Такой стойкий, щёкочущий нос аромат.
      Только хочу напомнить любителям IIFа, что в отличии от тернарника обе его вореции - истинная и фальшивая вычисляются сразу
      iif(isnull((SELECT H_ALL FROM S_KODGR WHERE GR.D1 = S_KODGR.K_KOD)),0,(SELECT H_ALL FROM S_KODGR WHERE GR.D1 = S_KODGR.K_KOD)) +
      То есть каждый iif вычислит по джва запроса.
      Но полагаю в таком УГ как access такая просадка пирфоманса некритична.
      Ответить
    • >приходится использовать iif. И 31 подзапрос превращается в 62
      Зачем IIF?
      SELECT isnull(H_ALL FROM,0) S_KODGR WHERE GR.D31 = S_KODGR.K_KOD
      Не?
      Ответить
    • блять, ну и пиздец
      аксесс май эсс

      кроме переделывания рахитектуры может помочь pivot, если он есть в средствах бд

      ну и затем, учитывая, что тут тупо сраная сумма считается, s_kodgr.k_kod, sum(h_all) .. group by s_kodgr.k_kod позволит не делать эти несчастные decode iif
      если нужны суммы даже для тех, где ничего нет - лефт джойн во внешнем запросе
      Ответить
      • Это ж аксесс. Он такого не умеет.
        Ответить
        • см тред ниже
          вместо 186 подзапросов можно обойтись одним джойном и божественным ифом
          хоть case when x = 1 then column1 when x = 2 then column2 ... when x = 31 then column31 end
          уж это эссэсс умеет?
          Ответить
          • Ну либо вообще на уровне прикладнухи раздербанить... Если, конечно, результат не нажо передавать в какой-нибудь унылый отчетник.
            Ответить
    • > H_ALL

      очевидно очепятка. поле хотели назвать `HELL`.
      Ответить
      • HALL_9000
        Ответить
        • их темпами

          > > И 31 подзапрос превращается в 62
          > > 62 подзапроса превращаются в 124

          геометрическая прогрессия, до 9000 еще ковылять и ковылять. времени предостаточно для еще огого сколько энтерпрайз принсипал архитектов карьеру сделать.
          Ответить
          • Тот комментарий был больше расчитан на людей знакомых с Космической Одиссеей, чем с интернет-мемом.
            Ответить
            • I'm sorry Dave, I'm afraid I can't do that.

              PS тут еще только HAL-124. и ковылять им до 9000...
              Ответить
    • ДАВАЙТЕ ФЛУДИТЬ И ТРОЛЛИТЬ! ;)
      Ответить
    • Что-то тут не то...
      Ответить
    • -
      Ответить
    • помнится мне, после ~70 union all я получил ошибку типа "Извините, но вы достигли предела ресурсов Access". как вам удается заставить его работать? =)
      Ответить
      • > ~70 union all
        в консерватории надо что-то исправить
        Ответить
        • > что-то исправить
          Табличку с 70 колонками, которую этим запросом unpivot'или...
          Ответить
          • но в этом случае можно обойтись без юнион совсем, даже когда сама субд не предлагает unpivot:
            select choose_by_pos_func(seq70.value, t.c1, t.c2, t.c3... t.c70) as omg_extracted_value
              from omg_fucking_shit_table t
                 cross join generated_sequence_1_70 seq70
            где generated_sequence_1_70 - это мы даже в майскл недавно видели, а choose_by_pos_func - адский пиздец, начиная от decode(seq70.value, 1, t.c1, 2, t.c2, 3, t.c3 ...) и его аналогов (в т.ч. самописных), заканчивая склейкой значений t.c1..t.c70 в какой-нибудь xml/тупо строку для бедных, и поиск n-th значения через возможные средства xml/регексп/субстр

            в постгресе, небось, колонки вообще можно собрать в массив и вообще вытаскивать из него ячейку по индексу (тут уж борманд расскажет)

            но для начала, надо найти того, кто придумал эти c1..c70, и отпилить ему ручонки ржавым тупым ножом
            Ответить
            • > тут уж борманд расскажет
              Ну вот так можно, к примеру: http://sqlfiddle.com/#!15/8c954/2
              Ответить
          • эксес умеет пайвот? Реально, можно таблицу провернуть?

            Я думал у MS только кубы, excel и SQL умеюит
            Ответить
            • Через запрос с 70 юнионами все умеют.
              Ответить
              • >>Через запрос с 70 юнионами все умеют.
                Когда у тебя 70 колонок?
                Ответить
            • гляди собачка какая хуйня (тм)
              https://stackoverflow.com/questions/16691853/transform-and-pivot-in-access-2013-sql
              Ответить
              • Ого, не думал что даже акцэсс могёт.
                Ответить
              • Access умеет, MySQL нет: https://en.wikibooks.org/wiki/MySQL/Pivot_table
                Правда и на счет postgresql я не уверен:)

                Вот ms-sql умеет очень давно, и excel тоже
                Ответить
                • в чем ты не уверен?
                  https://www.postgresql.org/docs/10/static/tablefunc.html
                  прост не стали выносить как очередное расширение синтаксиса sql, а сделали как функцию
                  Ответить
                  • теперь уверен, спасибо.

                    хе-хе, psql еще умеет так:
                    \crosstabview [ colV [ colH [ colD [ sortcolH ] ] ] ]
                    Executes the current query buffer (like \g) and shows the results in a crosstab grid.
                    Ответить
                    • во всех реализациях пивотов бесит то, что приходится явно декларировать что же получается - перечислять колонки, типы

                      неоднозначная тема в целом, оч вербозная
                      Ответить
                      • Ну в экселе и в клиентах кубов можно просто перетащить их мышкой
                        Ответить
    • Въебал минус сукиным детям.
      Ответить
    • как-то мало подзапросов
      Ответить
    • Автор нубло IsNull http://office.microsoft.com/ru-ru/access-help/HA001228867.aspx
      в Access-e есть и NZ в запросах прекрасно работает. И ведь не лень всю эту хуету было писать, погуглить видимо не судьба.
      Ответить
      • Умник, блять, почитай сперва описание, а потом пиши хуету в комментах
        Ответить
    • стыдоба
      Ответить

    Добавить комментарий