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

    +1

    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
    select
      x1.airport, x1.amount, x1.exempt
    from
      Taxes x1
    where
      x1.code = 'departure'
      and x1.airport in (
        select
          xx1.airport
        from
          (select
            yx1.airport
          from
            Taxes yx1
          where
            yx1.airport = x1.airport
            and yx1.code = x1.code
          group by
            yx1.airport, yx1.amount, yx1.exempt
          ) xx1
        group by xx1.airport
        having count(xx1.airport) > 1
      )
    ;

    Давно я не копался в SQL. Вот что нагородил :(

    Суть такова: у аэропортов есть departure tax, который может быть разный в зависимости от некоторых критериев (нерелевантно каких).
    А может быть и одинаковый. Но все равно аэропорт может иметь несколько рядков в БД (с одинаковым amount). А еще может быть exempt = 'X',
    что тождественно amount = 0.

    Задача: выбрать все рядки с departure tax для аэропортов у которых taxamt/exempt разный в зависимости от некоторых других критериев.

    Запостил: Elvenfighter, 10 Мая 2018

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

    • ИЧСХ, оно работает неправильно
      Ответить
      • не уверен, что я правильно пони задачу, но на

        http://sqlfiddle.com/#!17/5ada1/1

        немного подзаебался, чтобы сохранить возможность применения потенциального индекса по airport/code в подзапросе (отсюда и латерал)
        Ответить
        • ну и тупо, в лоб, конечно, тоже прокатит
          надо план смотреть на твоих данных
          http://sqlfiddle.com/#!17/5ada1/3
          Ответить
    • Похоже на пацкаль.
      Ответить
    • Попутно вопрос: зачем досихпор SQL предполагается ПИСАТЬ КРИКОМ? (напр. так предлагают делать автоподстановка а Oracle SQL Developer и w3schools).
      Ответить
      • Это хорошо читается, видно без подсветки даже в терминале, где ключевые слова, а где имена сущностей. Если говорить об эстетике, в этом есть свой стиль. Ещё некоторые подстветки (например, в моём саблайме) понимают, что строка является запросом по такому признаку, легко получается отличить от строкового литерала.
        Ответить
        • а у тебя запросы прямо в код вшиты?
          Ответить
          • Попадается такой код на работе, но это, конечно, боже упаси.
            Просто есть вещи, которые нихуя не выразишь на query builder'ах всяких фреймворков. Всякие подзапросы. Я подозреваю, что это, конечно из-за незнания sql или конкретного билдера, но иногда на узнавание нет времени, а под рукой предательски маячит raw query.

            Кстати, а как у богов?
            Ответить
            • У богов стараются выносить SQL в отдельные файлы и использовать prepared statement если не хватает квери билдера.

              Условно говоря:

              do_all.sql:
              "SELECT * from pitushok where kurochka> @n"
              Ответить
      • исторически

        ps: sql developer sux
        use datagrip, luke
        Ответить

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