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

    −164

    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
    select top 1000
    		[ObjectType] = N'Scv',
    		[SourceCodeId] = d.[IDOBJ], 
    		[ParameterName] = N'DlitZamera',
    		[DateTime] = l1.[VALUEDATE], 
    		[Value] = l1.[PERIOD], 
    		[vValue] = NULL, [IsLive] = 1
    from tm_mn_c8_kust.[dbo].[Lg] as l1
    left join tm_mn_c8_kust.[dbo].[Lg] as l2 on (l1.IDOBJ=l2.IDOBJ and l1.ValueDATE<l2.ValueDATE)
    inner join tm_mn_c8_kust.[dbo].[TiiDat] as d on d.IDDAT = l1.IDOBJ
    where 	l1.TYPEOBJ=330 and 
    		l1.IDPAR=15 and
    		l2.ValueDATE is null

    Задание:
    Выбрать последнее добавленное значение из таблицы и заджойнить данные из другой таблицы

    Решение:
    Join таблицы с самой собой по условию l1.ValueDATE<l2.ValueDATE и взять только строки, которые не сростились :)
    (Строки 9 и 13)

    Запостил: SatanicArmpit, 21 Мая 2015

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

    • > Решение:
      и что не так? это классика
      далее уже оптимизатор разруливает задачу плана запроса

      можно ещё rank(), если поддерживается субд (судя [по] [этому] кромешному [пиздецу] - поддерживается)

      главное, не max() в подзапросе
      Ответить
      • На серваке Sql 2000, так что Ранка нет.
        Юзать "классику" в таблице с 13,5 млн записей? ну, ок...
        Ответить
        • юзать логику "последнее добавленное значение из таблицы" на таблице с 13.5 млн записей без адекватных рахитектурных решений - ну ок

          постройте индекс typeobj, idpar, idobj, valuedate и добавьте в условие джойна все эти колонки, если такой поиск реально нужен постоянно

          когда же мне нужна была такая логика, я не обломался выделить специальную "булевую" колонку, в которой стоит true, если эта запись является конечной для своей группы, заиндексироваться вместе с этой колонкой и при инсерте новой записи сделать дополнительный апдейт по предыдущей последней записи
          Ответить
          • Да Вы, сударь, знатный говнокодер! Я то думал: "Кто эту 'базу' разрабатывал?", а это оказывается Вы постарались.
            Ответить
            • неплохо пригорело, что аж 4 аккаунта пришлось завести
              Ответить
            • http://pastebin.com/WkxenpKs

              какой вариант получения "последнего значения" я ещё не учел?
              Ответить
      • То есть, хэшмэтч на лефт джоине, который сожрет примерно 90% времени, это нормально?
        Ответить
      • Я ОТКАЗЫВАЮСЬ ОПТИМИЗИРОВАТЬ ЭТУ ХЕРНЮ!
        Ответить
    • >> не сростились

      наверное, это единственная ошибка?
      Ответить

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