#sql #sql-server #sql-in
#sql #sql-сервер #sql-in
Вопрос:
У меня проблема с:
select UsersInfo.fName 'نام', UsersInfo.lName 'نام خانوادگی'
from UsersInfo
where UsersInfo.MemberID in (
select COUNT(ToLend.UserID), ToLend.UserID 'تعداد کتاب های قرض گرفته'
from ToLend
inner join UsersInfo on ToLend.UserID = UsersInfo.MemberID
group by UserID
having count(UserID) > 2
)
Ошибка:
В списке выбора может быть указано только одно выражение, если подзапрос не введен с помощью EXISTS.
Как в этом коде можно «считать» для идентификатора пользователя?
Комментарии:
1. Что вы пытаетесь сделать? Примеры данных и желаемые результаты помогут прояснить ваш вопрос.
2. При использовании
IN
и подзапроса подзапрос должен возвращать только один столбец, например:SELECT * FROM TABLE1 WHERE ID IN (SELECT ID2 FROM TABLE2)
3. Удалите
COUNT(ToLend.UserID),
.
Ответ №1:
Вы хотите, чтобы внутренний select возвращал идентификатор пользователя. Зачем тогда вы добавляете count()?
select UsersInfo.fName 'نام', UsersInfo.lName 'نام خانوادگی'
from UsersInfo
where UsersInfo.MemberID in (
select ToLend.UserID 'تعداد کتاب های قرض گرفته'
from ToLend
inner join UsersInfo on ToLend.UserID = UsersInfo.MemberID
group by UserID
having count(UserID) > 2
)
Является ли MemberID уникальным ключом в UsersInfo?
Если это так, вы можете изменить свой запрос на:
select UsersInfo.fName 'نام', UsersInfo.lName 'نام خانوادگی'
from UsersInfo
where (select count()
from ToLend
where ToLend.UserID = UsersInfo.MemberID
) > 2
ОБНОВЛЕНИЕ: чтобы получить count() в выходных данных:
select UsersInfo.fName 'نام', UsersInfo.lName 'نام خانوادگی' , count()
from UsersInfo
inner join ToLend
where ToLend.UserID = UsersInfo.MemberID
group by UsersInfo.MemberID, UsersInfo.fName, UsersInfo.lName
having count() > 2
Мне пришлось добавить UsersInfo.MemberID
в группу by, поскольку я не уверен, что комбинация fName
lName
уникальна. Если это так, вы можете исключить UsersInfo.MemberID
из группы by.
Комментарии:
1. вау, это намного короче, чем у меня. спасибо, братан, но мой вопрос о другом, я хочу показать счетчик идентификатора пользователя с помощью функции подсчета в отдельном столбце
Ответ №2:
Если вы хотите знать, какому пользователю предоставлено > 2, вы можете удалить COUNT(добавить.Идентификатор пользователя) в подзапросе. И если вы хотите знать, сколько раз предоставляется, вы можете добавить подзапрос в select
select UsersInfo.fName 'نام',
UsersInfo.lName 'نام خانوادگی',
(select COUNT(UserID)
from ToLend
where UserID = UsersInfo.MemberID
group by UserID
having count(UserID) > 2) 'Lended count'
from UsersInfo
where UsersInfo.MemberID in (
select ToLend.UserID 'تعداد کتاب های قرض گرفته'
from ToLend
inner join UsersInfo on ToLend.UserID = UsersInfo.MemberID
group by UserID
having count(UserID) > 2
)
Комментарии:
1. да-а-а-а, очень, очень спасибо, Эмануэле леони, я очень хочу этот outputer извините, не могли бы вы, пожалуйста, объяснить свой код, я не понимаю, как это работает, спасибо, брат
2. Привет @rezatajari, рад вам помочь. (выберите COUNT(userId) из ToLend …) в SELECT возвращает количество предоставленных UsersInfo > 2. Этот подзапрос необходим, потому что вы не можете получить эти данные только в одном запросе. Дайте мне знать, если я ответил на ваш вопрос.
3. Да, братан, теперь я понял, что ты имеешь в виду, большое спасибо./
Ответ №3:
Вы можете просто изменить свой код, как показано ниже
SELECT UsersInfo.fName 'نام'
,UsersInfo.lName 'نام خانوادگی'
,a.UserId 'تعداد کتاب های قرض گرفته'
,a.[cnt]
FROM UsersInfo u
JOIN (
SELECT COUNT(ToLend.UserID) [cnt]
,ToLend.UserID
FROM ToLend
INNER JOIN UsersInfo ON ToLend.UserID = UsersInfo.MemberID
GROUP BY UserID
HAVING count(UserID) > 2
) a ON a.UserID = u.MemberId