Хобрук: Ваш путь к мастерству в программировании

Как я могу исключить другое значение из столбца в объединенной таблице SQL

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

Любая помощь будет очень признательна - это доводит меня до стены :)

У меня есть две таблицы, одна USERS вторая; ПРИОБРЕТЕННАЯ ПРОДУКЦИЯ. Пользователь может иметь несколько продуктов в таблице PRODUCTS.

У меня есть объединенный запрос, в котором я возвращаю список пользователей, у которых есть определенный продукт - пока все хорошо.

Теперь вот проблема:

Я хочу исключить ПОЛЬЗОВАТЕЛЕЙ, у которых есть другой конкретный продукт.

Поэтому возвращайте только пользователей, у которых есть продукт 1001, а НЕ пользователей, у которых есть оба продукта 1001 И 1002 в таблице PRODUCTS.

29.02.2012

Ответы:


1

Немного другой подход:

SELECT u.user_id
FROM users u
JOIN purchased_products p
  ON u.user_id = p.user_id AND 
     p.product_id in (1001, 1002)
GROUP BY u.user_id
HAVING COUNT(DISTINCT p.product_id) = 1 AND
       MIN(p.product_id) = 1001
29.02.2012
  • Это решение также работает должным образом и хорошо работает на сервере SQL. Я бы сказал, что это правильное решение, если производительность является приоритетом. Большое спасибо Марк. 29.02.2012

  • 2

    возвращать только пользователей, у которых есть продукт 1001, а НЕ пользователей, у которых есть оба продукта 1001 И 1002 в таблице PRODUCTS.

    Если вы используете SQL Server 2005 или более позднюю версию, вы можете использовать

    SELECT U.Id
    FROM [User] U INNER JOIN Product P ON U.Id = P.UserId AND P.ProductId = 1001
    EXCEPT
    SELECT U.Id
    FROM [User] U INNER JOIN Product P ON U.Id = P.UserId AND P.ProductId = 1002
    

    который, как предполагает слово "EXCEPT", вернет идентификаторы для пользователей, у которых есть продукт 1002, за исключением случаев, когда у них также есть продукт 1002.

    29.02.2012
  • В данном случае мы используем 2000. Но ваш ответ очень полезен, спасибо. 29.02.2012

  • 3
  • Это работает с ожидаемыми результатами, но медленно. Таблицы, которые я запрашиваю, довольно велики: в таблице пользователей содержится более 800 тыс. строк, а в таблице Product — ок. 300 тыс. Однако в данном случае производительность не имеет решающего значения, так как мне нужно запускать программу только для периодических отчетов. Большое спасибо за ваш вклад. 29.02.2012

  • 4
  • Обратные кавычки специфичны для MySQL - OP использует SQLServer. 29.02.2012
  • Это решение также работает на SQL-сервере - после удаления обратных кавычек :) Спасибо! 29.02.2012
  • Новые материалы

    #093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
    TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..

    numberToString.js (8kyu 16)
    Алгоритм кодовых войн Проблема Нам нужна функция, которая может преобразовать число в строку. 숫자를 문자열로 변환하는 함수를 작성해라. Решение 01 function numberToString(n) { return n.toString(); }..

    Лучшие практики для быстрого изучения языка программирования
    Изучение языка программирования может быть сложной задачей, но при правильном подходе определенно возможно быстро выучить язык программирования. Хорошее понимание языка программирования может..

    Использование данных из Adobe Analytics в предложениях Adobe Target
    Я уверен, что все видели эти всплывающие окна в интернет-магазинах, которые говорят что-то вроде « 15 человек просматривают этот товар прямо сейчас! » или « 105 человек из Мичигана купили это..

    Машинное обучение и его набор данных в CreateML
    Когда я впервые начал учиться в Apple Developer Academy, у меня был момент неуверенности в моем интересе к машинному обучению. Нужно ли мне сменить карьеру моей мечты с специалиста по данным на..

    Обучение требует воли
    Недавно я прочитал отличную статью Шейна Легга и Джоэла Венесса из DeepMind. http://arxiv.org/pdf/1109.5951v2.pdf В статье «универсальный интеллект» агента π определяется как: Поэтому..

    Безопасность по дизайну делает всех счастливыми
    Заложенная безопасность делает всех счастливыми Если вы никогда не смотрели Louis C.K. рассказать о том, как Все удивительно, и никто не счастлив ; побаловать себя. Сделайте это прямо..