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

Откуда: Minsk Power Station
Сообщений: 514
Тысячу извинений, есть запрос один, и у него одно поле генерится путём подзапроса:
SELECT ..., (select rel.information from products AS p2 INNER JOIN relations as rel ON p2.ID = rel.PID where p1.ID = p2.ID and rel.[SID]=2) as information, ... FROM ...

теперь вот ещё одно поле понадобилось из той же таблицы relations, его также надо оформлять в виде нового подзапроса?
(select rel.additions from products AS p2 INNER JOIN relations as rel ON p2.ID = rel.PID where p1.ID = p2.ID and rel.[SID]=2) as addition,

Или можно каким-то образом соединить с существующим? ну т.е. чтобы подзапрос возвращал 2 поля: rel.information, rel.additions
13 фев 17, 20:00    [20208999]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос с двумя полями  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
outer apply
13 фев 17, 20:02    [20209002]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос с двумя полями  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 514
по чуйке вписал outer apply в запрос... вот весь запрос:
SELECT p1.ID, v.[Name], pg.[Name], ts.[Transport], p1.Visible AS empty, p1.Quantity, p1.LastUpdate,
(select cast(rel.[SID] as varchar(3)) + '(' + convert(varchar(6), convert(int, ISNULL(rel.[SVALUE], 0))) + '/' + cast(ISNULL(rel.[SCOUNT],0) as varchar(4)) + ');' as 'data()' FROM Products AS p2 INNER JOIN relations as rel ON p2.ID = rel.PID WHERE p1.id = p2.id order by rel.[SID] for xml path('')) as suppliers,
tbl.information, tbl.additions, --ЭТО ДОБАВИЛ
pg.Prestige 
FROM	Products AS p1 INNER JOIN 
		Models AS pg ON p1.ModelID = pg.ID INNER JOIN 
		Vendors AS v ON pg.VendorID = v.ID LEFT JOIN 
		relations AS rel ON p1.ID = rel.PID INNER JOIN 
		Typesizes AS ts ON p1.ID = ts.ID
		OUTER APPLY (select rel.[PID], rel.[information], rel.[additions]    --ЭТОТ БЛОК ДОБАВИЛ
						from products AS p2 INNER JOIN 
						relations as rel ON p2.ID = rel.PID 
						where p1.ID = p2.ID and rel.[SID]=2) tbl
		LEFT JOIN Products p3 ON p3.ID = tbl.PID                     --ЭТО ДОБАВИЛ
WHERE rel.[sID] = 2 OR p1.ID IN (11586,5320,50067,13735,50140) 
GROUP BY ts.[Transport], p1.ID, p1.Visible, p1.LastUpdate, p1.Quantity, v.[Name], pg.[Name], pg.Prestige, pg.CategoryID, tbl.information, tbl.additions 
ORDER BY 2, 3, 4

А принципе, запрос вроде всё верно отдаёт, но
меня беспокоит что я таблицу Products дважды присоединил (p3). И ещё relations может один раз в OUTER APPLY достаточно?
Взгляните краем глаза пожалуйста, чтобы красиво всё вышло: что лучше исправить с глаз долой?
13 фев 17, 21:07    [20209130]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос с двумя полями  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
palladin600
по чуйке вписал outer apply в запрос...
Похоже вы весь запрос "по чуйке" писали.
Вот так, примерно, должно быть:
SELECT
 p1.ID, v.[Name], pg.[Name], ts.[Transport], p1.Visible AS empty, p1.Quantity, p1.LastUpdate,
 (select cast(r.[SID] as varchar(3)) + '(' + convert(varchar(6), convert(int, ISNULL(r.[SVALUE], 0))) + '/' + cast(ISNULL(r.[SCOUNT],0) as varchar(4)) + ');' as 'data()' FROM relations as r WHERE r.PID = p1.ID order by r.[SID] for xml path('')) as suppliers,
 rel.information, rel.additions, pg.Prestige 
FROM	Products AS p1 INNER JOIN 
		Models AS pg ON p1.ModelID = pg.ID INNER JOIN 
		Vendors AS v ON pg.VendorID = v.ID LEFT JOIN 
		relations AS rel ON p1.ID = rel.PID and rel.[SID] = 2 INNER JOIN 
		Typesizes AS ts ON p1.ID = ts.ID
WHERE p1.ID IN (11586,5320,50067,13735,50140) 
GROUP BY ts.[Transport], p1.ID, p1.Visible, p1.LastUpdate, p1.Quantity, v.[Name], pg.[Name], pg.Prestige, pg.CategoryID, rel.information, rel.additions 
ORDER BY 2, 3, 4
13 фев 17, 23:36    [20209451]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос с двумя полями  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 514
invm,
ГранМерси сударь!

поправил, заработало, :)
только выдало ограниченную серию результатов...
пришлось вернуть условие WHERE
на
WHERE rel.[sID] = 2 OR p1.ID IN (11586,5320,50067,13735,50140)

если rel.[sID] не указывать возвращает только пять записей...
13 фев 17, 23:49    [20209468]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить