SQL-запрос, чтобы проверить, присвоено ли пользователю определенное значение и не присвоено ли тому же пользователю другое значение?

#sql #sql-server #select #where

#sql #sql-server #выберите #where-предложение

Вопрос:

У нас могут быть пользователи с несколькими valueID s. В SQL Server я пытаюсь вывести всех пользователей, у которых есть valueID of 3 , но нет valueID of 1 и 2 . Таким образом, в таблице A будут user столбец и valueID колонка.

Как мне написать SQL-запрос для этого?

Кроме того, есть какие-нибудь хорошие ресурсы, чтобы довести мои навыки выполнения SQL-запросов до совершенства?

Большое спасибо.

Комментарии:

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

Ответ №1:

Попробуйте:

 SELECT  user
FROM    A outer
WHERE   valueID = 3
AND NOT EXISTS
(
    SELECT  1
    FROM    A inner
    WHERE
    (
                valueID = 1
        OR      valueID = 2
    )
    AND     inner.user = outer.user
)
  

Комментарии:

1. Большое вам спасибо! Это именно то, что я искал.

2. @Wolverine313, судя по твоему вопросу, это не так. Это не позволит найти пользователей со значениями 3 и 1 или 3 и 2

3. @TonyHopkinson, я хотел найти пользователей только со значением 3, и у них также нет значений 1 и 2. Это единственные идентификаторы значений, которые существуют. Таким образом, с помощью этого запроса он выводит список всех пользователей, у которых значение равно 3, и у них также нет значения 1 или 2. Приношу свои извинения, если мой первоначальный вопрос был неясен. Ценю ваш отзыв.

4. @ТониХопкинсон NOT(1) AND NOT(2) == NOT(1 OR 2) .

5. @TrippKinetics Not (1 И 2) != Not (1 или 2). Тем не менее, вы, похоже, случайно поняли это правильно..

Ответ №2:

Вот еще одно …. (все пользователи со значением = 3 и ничего больше)

 SELECT  [USER]
FROM    A
GROUP BY [USER]
HAVING  MAX(CASE WHEN valueid = 3 THEN 0 when valueid IN (1,2) THEN 1 END) = 0;
  

Комментарии:

1. @Tony True… Но мне понравилась простота этого 🙂 Может быть, есть способ учесть это, сохраняя ту же простоту?

2. @Tony… Отредактировано. Что вы думаете?

3. Когда valueid в (1,2), то 1 Еще 0, я думаю. Я бы сделал это с помощью двух объединений, хотя, похоже, OP в любом случае задал неправильный вопрос…

4. Согласен с последней частью … в вопросе «но не имеют valueId 1 и 2» звучит как «3, а не (1 и 2)»…

Ответ №3:

Этот запрос вернет всех пользователей, у которых есть значения (3 и 1) или (3 и 2) или просто 3

 select user
from mytable t1
where valueId = 3
and (select count(distinct valueId)
from mytable t2 where t2.user = t1.user
and valueId IN (1,2)) < 2
  

Ответ №4:

Простой способ получить то, что вы просили, если вы имели в виду пользователей со значением 3, за исключением тех, которые также имеют значения 1 и 2

 Select s.UserID From SomeTable s
Where s.UserID NOT In 
(select s1s.UserID From SomeTable s1s 
inner join  SomeTable s2s On s1s.UserID = s2s.UserID 
Where s1s.ValueId = 1 And s2s.ValueId = 2)
  

Или

 Select s.UserID From SomeTable s
Left Join
(select s1s.UserID From SomeTable s1s 
inner join  SomeTable s2s On s1s.UserID = s2s.UserID 
Where s1s.ValueId = 1 And s2s.ValueId = 2) both
Where both.userID is null
  

Ответ №5:

Я не совсем уверен, какова структура вашей таблицы, но, вероятно, приведенный ниже запрос должен работать в зависимости от имен столбцов…

 SELECT user, valueID
FROM users
WHERE valueID = 3
  

Комментарии:

1. Это не позволит отфильтровать user файлы, которые имеют valueID значение 1 или 2.