Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
icef1ery Member Откуда: Сообщений: 61 |
Здравствуйте уважаемые форумчане нужна помощь. Если кто поможет буду благодарен. Есть 2 таблицы. Первая таблица: Название markcust Поля idmarkcust (int), customer_id (int), mark_id (int). (запрос select *) ![]() Вторая таблица: Название marka Поля marka_id (int), marka (char). (запрос select *) ![]() Связь FK_markacust_marka между "marka" и "markacust" Что необходимо покажу (на примере). Необходимо записать в одну строчку (ячейку) данные у которых одинаковый customer_id. Пример: select distinct markacust.customer_id, markacust.marka_id, (select cast(marka_id as nvarchar) + ',' as 'data()' from [isp_dog].[dbo].[markacust] t2 where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id group by marka_id for xml path('') ) from [isp_dog].[dbo].[markacust] group by markacust.marka_id, markacust.customer_id Результат: ![]() То есть distinct результат ![]() А теперь к проблеме. Данное соединение у меня получается только в текущей таблице, а мне необходимо соединить данные из справочника(дополнительной таблицы №2). Но почему то когда я её соединяю join'ом и пишу запрос ответ она выводит не правильный. Пример моего кода select distinct markacust.customer_id, markacust.marka_id, marka.marka, (select cast((marka) as nvarchar) + ',' as 'data()' from [isp_dog].[dbo].[markacust] t2 left join [isp_dog].[dbo].[marka] on marka.marka_id=markacust.marka_id where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id for xml path('') ) from [isp_dog].[dbo].[markacust] left join [isp_dog].[dbo].[marka] on marka.marka_id=markacust.marka_id И результат ![]() нужно получить следующие SQL запрос должен вернуть следующие данные ![]() или distinct значение необходимое в итоге ![]() то есть в конечном итоге нужно вернуть только marka1, marka2, marka3 вот это не получается Добавлю, что из первого примера следует то, что если нужно получить данные из одной таблицы проблемы не возникает. А вот если соединить таблицы join'ом, то результат запроса получается не тот, который нужен. Если кто нибудь сможет помочь буду рад. Спасибо. |
11 апр 13, 15:55 [14168005] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ну так уберите markacust.customer_id, markacust.marka_id из списка полей запроса |
||
11 апр 13, 15:57 [14168030] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
icef1ery, расставьте у всех таблиц алиасы! |
11 апр 13, 15:58 [14168039] Ответить | Цитировать Сообщить модератору |
icef1ery Member Откуда: Сообщений: 61 |
Зачем, что то убирать пока не получен желаемый результат? как убрать ненужные поля я знаю. Мне нужно изначально получить правильный результат, а потом запрос уменьшится в разы (уберутся половина join'ов и select почистится). |
||
11 апр 13, 16:15 [14168176] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Офигеть логика. Я хочу получить правильный результат, но текст запроса менять не буду. Помогите. |
||
11 апр 13, 16:17 [14168190] Ответить | Цитировать Сообщить модератору |
icef1ery Member Откуда: Сообщений: 61 |
Почему то из за функции cast которая имеет у себя в структуре cast( ........ as nvarchar)не получается расставить алиасы к этому полю. На запрос select cast((marka_id as nvarchar) as 'new colum')sql выдает "Неправильный синтаксис около ключевого слова "as"." Если подскажите как это сделать буду благодарен. |
||
11 апр 13, 16:20 [14168210] Ответить | Цитировать Сообщить модератору |
Cammomile Member Откуда: Сообщений: 1214 |
select cast((marka_id as nvarchar) as 'new colum') facepalm.jpg select cast(marka_id as nvarchar ) as "new colum" а еще лучше select [new colum] = cast(marka_id as nvarchar ) as Кстати, nvarchar какого размера то? |
11 апр 13, 16:31 [14168281] Ответить | Цитировать Сообщить модератору |
Cammomile Member Откуда: Сообщений: 1214 |
select [new colum] = cast(marka_id as nvarchar ([size]) ) |
11 апр 13, 16:32 [14168286] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
select '0'+cast(1 as varchar) as val |
11 апр 13, 16:33 [14168293] Ответить | Цитировать Сообщить модератору |
icef1ery Member Откуда: Сообщений: 61 |
Уважаемый Glory может быть мы не так друг друга поняли. Поясню еще раз. Первое: что получается в данном запросе ![]() Второе: что должно получится ![]() Обратите пожалуйста внимание на последние столбцы. В первом случае, что получается. Во втором что хотелось бы иметь. Если я уберу "markacust.customer_id, markacust.marka_id из списка полей запроса" то в Результате запроса просто уберется два первых столбца и не изменится результат в искомом последнем столбце. |
||
11 апр 13, 16:34 [14168302] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Значит надо убрать markacust.customer_id, markacust.marka_id, marka.marka Вы вообще понимаете, как работает distinct ?
Вы определитесь с желаемым результатом. А то он у вас меняется |
||||
11 апр 13, 16:37 [14168327] Ответить | Цитировать Сообщить модератору |
daw Member Откуда: Муром -> Москва Сообщений: 7381 |
icef1ery, вам про про алиасы ТАБЛИЦ говорили, а не столбцов. если б сразу расставили, такой ошибки вы бы не совершили: select distinct markacust.customer_id, markacust.marka_id, marka.marka, (select cast((marka) as nvarchar) + ',' as 'data()' from [isp_dog].[dbo].[markacust] t2 left join [isp_dog].[dbo].[marka] on marka.marka_id=t2.marka_id where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id for xml path('') ) from [isp_dog].[dbo].[markacust] left join [isp_dog].[dbo].[marka] on marka.marka_id=markacust.marka_id |
11 апр 13, 16:48 [14168412] Ответить | Цитировать Сообщить модератору |
icef1ery Member Откуда: Сообщений: 61 |
Да конечно я понимаю как работает distinct. И конечно я понимаю, что он не будет работать при таких полях в запросе. Изменяюсь, что не убрал его из примера. В пример я добавил markacust.customer_id, markacust.marka_id, marka.marka что бы было понятнее помогающим, что да как в базе. Забудем о distinct.
Вообще конечный результат должен быть таким (уже с применением distinct). ![]() Сейчас же у меня ![]() |
||||
11 апр 13, 16:54 [14168459] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
select a.customer_id, (select cast((b.marka) as nvarchar(200)) + ',' as 'data()' from [isp_dog].[dbo].[marka] b where b.marka_id=a.marka_id for xml path('')) as x from [isp_dog].[dbo].[markacust] a Сообщение было отредактировано: 11 апр 13, 17:00 |
11 апр 13, 16:59 [14168494] Ответить | Цитировать Сообщить модератору |
icef1ery Member Откуда: Сообщений: 61 |
Огромное спасибо. iap за то что подсказал, но я не понял. daw за то что разъяснил, что подсказал iap и Сделал мой день. а также Glory и Cammomile за оказанную помощь. Второй форум на котором я задавал данный вопрос. Но скорость ответов тут в 100 раз быстрее чем на первом. Спасибо еще раз всем кто помогал и форуму sql.ru. |
11 апр 13, 17:00 [14168504] Ответить | Цитировать Сообщить модератору |
icef1ery Member Откуда: Сообщений: 61 |
Вот вообще отлично Спасибо. Когда нибудь я также научусь. :) |
||
11 апр 13, 17:02 [14168520] Ответить | Цитировать Сообщить модератору |
icef1ery Member Откуда: Сообщений: 61 |
select distinct (select cast((marka) as nvarchar) + ',' as 'data()' from [isp_dog].[dbo].[markacust] t2 left join [isp_dog].[dbo].[marka] on marka.marka_id=t2.marka_id where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id for xml path('') ) as new from [isp_dog].[dbo].[markacust] left join [isp_dog].[dbo].[marka] on marka.marka_id=markacust.marka_id вот совершенно правильный работающий код. Спасибо. |
11 апр 13, 17:11 [14168574] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Только офигительно избыточный Зачем join-ы ? Чтобы дольше работало ? |
||
11 апр 13, 17:13 [14168585] Ответить | Цитировать Сообщить модератору |
icef1ery Member Откуда: Сообщений: 61 |
Согласен на счет последнего join'a он лишний, а вот без первого не обойтись (по моему). select distinct (select cast((marka) as nvarchar) + ',' as 'data()' from [isp_dog].[dbo].[markacust] t2 left join [isp_dog].[dbo].[marka] on marka.marka_id=t2.marka_id where [isp_dog].[dbo].[markacust].customer_id = t2.customer_id for xml path('') ) as new from [isp_dog].[dbo].[markacust] Если есть советы по оптимизации данного запроса то буду рад если поможете. |
||
12 апр 13, 08:36 [14170756] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |