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

    −145

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    select distinct idsclad
    from impRemainder
    where idsclad not in (
        select distinct idsclad
        from impRemainder
        where idmodel = $idmodel
    )

    Получить все склады, на которых нет этого товара

    Запостил: marbledore, 19 Марта 2010

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

    • Видать от большого знания сделано
      Ответить
      • Согласен, обычно так поступают нубы.
        Ответить
    • Масло -- масленное. Дверь -- дверная.
      Баден-Баден.
      Ответить
    • Вполне нормальная выборка с подселектом. Если делать иначе, сложнее думать. А зачем думать, если будет и так.
      Не одобряю, но и не порицаю.
      Ответить
      • 1) полностью просмотреть таблицу, выбрать оттуда все склады, сохранить выборку во временной таблице (возможно, что даже на диске, если выборка большая), потом ещё раз просмотреть, выбрать те, на которых есть товар, вычеркнуть их из первой выборки.
        2) один раз просмотреть и всё выяснить (COUNT и GROUP BY ... HAVING в помощь).
        Сам думай, что лучше.
        Ответить
        • А вот и нифига. Тут left join с проверкой на NULL в where
          Ответить
          • Тоже вариант, но в любом случае будет иметь место полный просмотр таблицы, если только нет составного ключа (idsclad - idmodel). По-моему, то же на то же.
            Ответить
        • Типа того, короче:
          SELECT distinct(t1.idsclad) FROM impRemainder as t1 left join impRemainder as t2 on t2.idmodel=$idmodel and t1.idsclad=t2.idsclad WHERE t2.idsclad is NULL
          Ответить
          • Спасибо, капитан. В любом случае, мы будем джойнить таблицу саму на себя. А оно нам надо?
            Ответить
        • Какая разница, если оптимизатор запросов того же mssql что "not in (select ...)", что "left join ... where ... is null" преобразует в плане всё равно к anti-semi-join'у?
          А вот второй предложенный вариант - воистину говнокод, с большой буквы "Г". Я уж не говорю про дикие соображениях о временных таблицах... Или речь шла о недосерверах типа мыскля?
          Ответить
        • Вы что, совсем тут е*нулись??? Просто
          SELECT DISTINCT idsclad FROM impRemainder WHERE idmodel <> $idmodel
          Ответить
          • этот запрос выведет также и склады, на которых есть idmodel=$idmodel, но и idmodel<>$idmodel
            Ответить
      • ну... (и учитывая то, что в impRemainder могут быть не все склады...)
        select id from sclad
        minus
        select distinct idsclad
        from impRemainder
        where idmodel = $idmodel
        Ответить

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