Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос из нескольких таблиц с подзапросом  [new]
Rwety
Member

Откуда:
Сообщений: 37
есть следующая структура базы данных( в приложении)

И есть запрос
SELECT p.PrName
	, p.Url as 'URL'
	, CONVERT(NVarChar(20),p.StartDate,101) as 'StartDate'
	, p.Plans
	, CAST(ROUND(i.Amount,0) as int)as 'Amount' 
	, COALESCE((SELECT COUNT(ui.InsuranceID) FROM UserInsurance WHERE ui.UserID != @UserID ),0) as 'Bought'
	FROM Programs as p  
	INNER JOIN UserPrograms as upr ON p.ID = upr.ProgramID 
	INNER JOIN ProgramInsurance as pri ON p.ID = pri.ProgramID
	INNER JOIN Insurances as i ON i.ID = pri.InsuranceID
	INNER JOIN UserInsurance as ui ON i.ID = ui.InsuranceID 
	WHERE (upr.UserID = @UserID)
	GROUP By PrName, Url, p.StartDate, p.Plans,i.Amount,ui.UserID, ui.InsuranceID 

Здесь делается выборка из трех таблиц, причем данные в таблице UserID UserInsurance дублируются, соответственно при запуске я получаю ошибку говорящую о том, что подзапрос(Count) возвращает больше чем одно значение. Путем экспериментов было установлено, что если закоментировать подзапрос - результат выводится столько строк с одинаковым набором данных, сколько записей с одинаковым UserID в таблице UserInsurance. Кароче говоря помогите кто знает как составить запрос таким образом, чтобы он возвращал только одну строку(набор данных) для конкретного ID. Спасибо

К сообщению приложен файл. Размер - 127Kb
19 окт 11, 20:51    [11469192]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
Может вы просто скажите, какую задачу пытаетесь решить .
19 окт 11, 20:57    [11469213]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
Rwety
Member

Откуда:
Сообщений: 37
Упс. Погарячился. Еще пару вариантов попробовал и все заработало на ура.
Тема закрыта
19 окт 11, 20:57    [11469216]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Rwety,

подзапрос с COUNT физически не может возвращать больше одного значения, поскольку он агрегатный. Далее, подзапрос у вас какой-то странный, условие ссылается только на внешний запрос и не ссылается на соственно подзапрос, соответственно результат будет либо количество записей в таблице UserInsurance, либо 0.
19 окт 11, 21:01    [11469225]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
Интересно, а зачем
INNER JOIN UserInsurance
и еще и
SELECT COUNT(ui.InsuranceID) FROM UserInsurance

?
19 окт 11, 21:02    [11469229]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
Rwety
Member

Откуда:
Сообщений: 37
iljy,

Да. Вы правы подзапрос с COUNT возвращает ноль всегда
Как исправить?
19 окт 11, 21:11    [11469265]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
Rwety
Member

Откуда:
Сообщений: 37
Glory,
Патаму что так SELECT COUNT(ui.InsuranceID) FROM ui WHERE ui.UserID != @UserID не работает
19 окт 11, 21:13    [11469270]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Rwety,

процедуру исправления разумнее всего начать отсюда.
19 окт 11, 21:18    [11469291]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
Rwety
Member

Откуда:
Сообщений: 37
Rwety,

А вроде въехал
SELECT p.PrName
	, p.Url as 'URL'
	, CONVERT(NVarChar(20),p.StartDate,101) as 'StartDate'
	, p.Plans
	--, CONVERT(NVarChar(20),i.StartDate,101) as 'InsStart'
	--, CONVERT(NVarChar(20),i.FinishDate,101) as 'InsFinish'
	, CAST(ROUND(i.Amount,0) as int)as 'Amount' 
	, COALESCE((SELECT COUNT(UserInsurance.InsuranceID) FROM UserInsurance WHERE UserInsurance.UserID != 4),0) as 'Bought'
	FROM Programs as p  
	--INNER JOIN UserPrograms as upr ON p.ID = upr.ProgramID 
	LEFT JOIN ProgramInsurance as pri ON p.ID = pri.ProgramID
	LEFT JOIN Insurances as i ON i.ID = pri.InsuranceID
	LEFT JOIN UserInsurance as ui ON i.ID = ui.InsuranceID 
	WHERE (ui.UserID = 4)
	GROUP By PrName, Url, p.StartDate, p.Plans,i.Amount,ui.UserID, ui.InsuranceID 
19 окт 11, 21:20    [11469306]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
Rwety
Glory,
Патаму что так SELECT COUNT(ui.InsuranceID) FROM ui WHERE ui.UserID != @UserID не работает

Вопрос был о том, почему одна таблица несколько раз в запросе участвует с разными псевдонимами
А не о том, как работает where
19 окт 11, 21:49    [11469426]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из нескольких таблиц с подзапросом  [new]
Rwety
Member

Откуда:
Сообщений: 37
Glory,

Спасибо. Навели меня на правильный ответ
19 окт 11, 22:01    [11469464]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить