#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.