Как я могу исключить другое значение из столбца в объединенной таблице SQL - PullRequest
2 голосов
/ 29 февраля 2012

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

Любая помощь будет принята с благодарностью - она ​​поднимает меня вверх по стене:)

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 29 февраля 2012
SELECT u.*
    FROM users u
        INNER JOIN purchased_products p
            ON u.user_id = p.user_id
                AND p.product_id = 1001
    WHERE NOT EXISTS(SELECT 1
                         FROM purchased_products p2
                         WHERE p2.product_id = 1002
                             AND p2.user_id = u.user_id)
0 голосов
/ 29 февраля 2012

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

Если вы используете 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.

0 голосов
/ 29 февраля 2012

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

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
0 голосов
/ 29 февраля 2012
SELECT * from user U
where (select count(*) from product P where P.user_id=U.user_id)=1
0 голосов
/ 29 февраля 2012
SELECT * from `user` 
    LEFT JOIN `product` on `user`.`id` = `product`.`user_id`
    WHERE `product`.`id` = <w1st_product_id>
        AND `user`.`id` NOT IN ( 
           SELECT user_id 
           FROM product 
           WHERE product.id = <2nd_product_id> 
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...