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

Откуда: Опорный край державы
Сообщений: 34
Добрый день. Есть большой запрос с JOINами, в нем вывожу значение по коду.

Есть таблица со справочником

ID NAME Parent
1 яблоко NULL
2 банан 10
3 кокос 10
4 тыква 20
5 огурец 20
.......
10 фрукты NULL
20 овощи NULL


Выше просто пример.

Мне нужно вывести ID, NAME и сейчас понадобилось PARENT_NAME

то есть срока вывода такая: 1, банан, 10, фрукт

Я не могу связать в большом запросе вывод из подзапроса.

Привожу код который выводит список предков - ОН работает, я получаю уникальный список предков

select [Voc_water_gorizont].Code_WG,  [Voc_water_gorizont].Water_gorizont from [dbo].[Voc_water_gorizont] 
	where [dbo].[Voc_water_gorizont].Code_WG IN 
	
		(select [dbo].[Voc_water_gorizont].Code_parent 
		from PN_condition
		left join [dbo].[Voc_water_gorizont]
		ON PN_condition.Code_WG = [Voc_water_gorizont].Code_wg )



Теперь мне нужно присобачить его к большому запросу, делаю это так:

select
olo = (
	select [Voc_water_gorizont].Water_gorizont from [dbo].[Voc_water_gorizont] 
	where [dbo].[Voc_water_gorizont].Code_WG IN 
	
		(select [dbo].[Voc_water_gorizont].Code_parent 
		from PN_condition
		left join [dbo].[Voc_water_gorizont]
		ON PN_condition.Code_WG = [Voc_water_gorizont].Code_wg 
		)

)


olo - одно из полей, их там около 20, ии как мне связать строки с этй внутренней выборкой я не понимаю, ошибка выдается такая:

Сообщение 512, уровень 16, состояние 1, строка 1
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.

Прошу подсказать правильное решение, заранее благодарю за помощ
15 ноя 17, 12:30    [20955561]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20527
j-ester
Есть таблица со справочником

ID NAME Parent
1 яблоко NULL
2 банан 10
3 кокос 10
4 тыква 20
5 огурец 20
.......
10 фрукты NULL
20 овощи NULL


Выше просто пример.

Мне нужно вывести ID, NAME и сейчас понадобилось PARENT_NAME

то есть срока вывода такая: 1, банан, 10, фрукт

SELECT t1.id id, t1.name name, t2.id parent_id, t2.name parent_name
FROM tablename t1
LEFT JOIN tablename t2 ON t1.parent = t2.id

Добавляешь это дело в свой "большой запрос с JOINами" как ещё один CTE-источник данных.
15 ноя 17, 12:58    [20955692]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Простите,я не так выразился. Имелось ввиду что на справочник ведут ссылки из каталога.

ПОлный запрос ниже.


select 
dbo.PN_catalogue.PN_Number AS '№ скв. по ГМСН по реестру',
dbo.PN_catalogue.PN_Name AS 'Номер по ТЦ ГМСН', 
dbo.PN_catalogue.Num_wateruser AS 'Номер по Недропользователю',
--dbo.Voc_region.Region AS 'Субъект РФ',
dbo.PN_correspondence.VisualPriv AS 'Местоположение', 
dbo.PN_correspondence.Shir_grad AS 'С.Ш. град', 
dbo.PN_correspondence.Shir_min AS 'С.Ш. мин', 
dbo.PN_correspondence.Shir_sec AS 'С.Ш. сек',
dbo.PN_correspondence.Dolg_grad AS 'В.Д. град', 
dbo.PN_correspondence.Dolg_min AS 'В.Д. мин', 
dbo.PN_correspondence.Dolg_sec AS 'В.Д. сек', 
dbo.PN_catalogue.AbsOtmUstie AS 'Абс. отм. устья скв.м',

--NULL AS 'Индекс',
--NULL AS 'Наименование ВГ',
dbo.Voc_water_gorizont.WG_index AS 'Индекс ВГ',
dbo.Voc_water_gorizont.[Water_gorizont] AS 'Водоносный горизонт',
dbo.Voc_water_gorizont.Code_parent AS 'Код предка ВГ',
Federal_WG = (select [Water_gorizont] from [dbo].[Voc_water_gorizont] t2 where t2.Code_WG = t2.Code_parent),



dbo.PN_regim_sroch_H.Date_zam AS 'Дата замера уровня',
dbo.PN_regim_sroch_H.Lev AS 'Глубина до уровня ПВ от поверхности земли, м',
dbo.Voc_observ_area.Observ_area_type AS 'Полигон', 
dbo.PN_regim_sroch_H.God AS 'Год',

dbo.Voc_cat_NS.Cat_NS AS 'Наблюдательная сеть',
dbo.VZ_catalogue.Vodozabor AS 'Водозабор',
dbo.OI_catalogue.OI_name AS 'Объект извлечения'

--select *

FROM dbo.PN_catalogue
left join dbo.Voc_region
	ON dbo.PN_catalogue.Code_district = dbo.Voc_region.Code_region 
left join dbo.PN_correspondence
	ON dbo.PN_catalogue.PN_Number = dbo.PN_correspondence.PN_Number	
left join dbo.PN_regim_sroch_H
	ON dbo.PN_catalogue.PN_Number = dbo.PN_regim_sroch_H.PN_number
left join dbo.Voc_observ_area
	ON dbo.PN_correspondence.Code_observ_area = dbo.Voc_observ_area.Code_observ_area
left join dbo.Voc_cat_NS
	ON dbo.PN_catalogue.Code_cat_NS = dbo.Voc_cat_NS.Code_cat_NS
left join dbo.OI_catalogue
	ON dbo.PN_correspondence.Code_OI = dbo.OI_catalogue.Code_OI
left join dbo.VZ_catalogue
	ON dbo.PN_correspondence.Code_VZ = dbo.VZ_catalogue.Code_VZ
	
		/* увиличилось за 2016 год с 1610 до 2433 , при привязке к PN_condition стало 2837*/
left join [dbo].PN_condition
	ON dbo.PN_catalogue.PN_Number = dbo.PN_condition.PN_Number
left join Voc_water_gorizont
	ON [dbo].PN_condition.Code_wg = Voc_water_gorizont.Code_WG

where dbo.PN_regim_sroch_H.God = @god 
AND dbo.PN_correspondence.Code_observ_area IS NOT NULL

GROUP BY 
dbo.PN_catalogue.PN_Number,
dbo.PN_catalogue.PN_Name, 
dbo.PN_catalogue.Num_wateruser,
dbo.PN_correspondence.VisualPriv, 
dbo.PN_correspondence.Shir_grad, 
dbo.PN_correspondence.Shir_min, 
dbo.PN_correspondence.Shir_sec,
dbo.PN_correspondence.Dolg_grad, 
dbo.PN_correspondence.Dolg_min, 
dbo.PN_correspondence.Dolg_sec, 
dbo.PN_catalogue.AbsOtmUstie,

dbo.Voc_water_gorizont.WG_index,
dbo.Voc_water_gorizont.[Water_gorizont],
dbo.Voc_water_gorizont.Code_parent,


dbo.PN_regim_sroch_H.Date_zam,
dbo.PN_regim_sroch_H.Lev,
dbo.Voc_observ_area.Observ_area_type, 
dbo.PN_regim_sroch_H.God,

dbo.Voc_cat_NS.Cat_NS,
dbo.VZ_catalogue.Vodozabor,
dbo.OI_catalogue.OI_name


Нужно в него интегрировать второй запрос к справочнику. Я делаю это так:

olo = (
select [Voc_water_gorizont].Water_gorizont from [dbo].[Voc_water_gorizont]
where [dbo].[Voc_water_gorizont].Code_WG IN

(select [dbo].[Voc_water_gorizont].Code_parent
from PN_condition
left join [dbo].[Voc_water_gorizont]
ON PN_condition.Code_WG = [Voc_water_gorizont].Code_wg
)

)
Где olo - одно из полей, по которому в конце можно сделать группировку.

Ваш вариант я понял, он немного для другого случая, хотя я сейчас попробую поковырятся
15 ноя 17, 13:59    [20956012]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20527
j-ester
Нужно в него интегрировать второй запрос к справочнику.

Ну я же вроде сказал как...

WITH (мой запрос) AS [справочник]
-- далее твой запрос
SELECT ...
FROM ... JOIN  [справочник] ON ...
...
15 ноя 17, 14:02    [20956036]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Добавлю

Самый последний left join УЖЕ соединен с этой таблицей и выводит данные

left join Voc_water_gorizont
ON [dbo].PN_condition.Code_wg = Voc_water_gorizont.Code_WG

А коды со ссылкой на справочник хранятся в [dbo].PN_condition

Вот по коду [dbo].PN_condition.Code_wg и нужно получить из справочника не только само значение, но и столбец предка и ИМЯ предка.
ТО есть запрос в запросе я так понимаю ?
15 ноя 17, 14:03    [20956037]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20527
j-ester
Самый последний left join УЖЕ соединен с этой таблицей
Вот тут и замени "эту таблицу" на CTE-таблицу.
15 ноя 17, 14:04    [20956050]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Не понимаю, зачем здесь какие-то подзапросы?
Кто мешает просто добавить JOINы во FROM?

И зачем накладываются условия в WHERE на правую таблицу LEFT JOINа?
Это же получается INNER JOIN?
15 ноя 17, 14:12    [20956098]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Akina,

Спасибо, я не профессионал и до этого не слышал о механизме CTE, сейчас погуглил и понял о чем вы.

Спасибо за наводку - буду разбираться, изучать, пробовать. Похоже то что нужно.
15 ноя 17, 14:16    [20956119]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
iap,
Возможно, я выше писал что не являюсь разработчиком БД, я строю запросы для выходных форм, так как никто больше этого не умеют, строю как помню из студенчества.

Если Вы укажете мне на конкретные ошибки и рекомендации - я буду ОЧЕНЬ Вам признателен. Вижу что у Вас много сообщений и вы явно опытнее меня в этих вопросах.

Заранее спасибо
15 ноя 17, 14:19    [20956130]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные запросы на одну таблицу, не могу победить  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Akina,

Спасибо большое, все получилось так как я и хотел.

Отдельное спасибо за то что узнал о таком замечательном механизме как СТЕ!
15 ноя 17, 14:52    [20956330]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить