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

Откуда:
Сообщений: 94
Добрый день.
Помогите, пожалуйста, с запросом.
select -- выгрузка без связи с локальным идентификатором
ph.orponid as "GlobalID"
, fil.name as "Филиал"
, ph.adr_adm_ter as "Адрес"
, eon.placecnt as "Квартир/офисов"
, eon.kol_pod as "Количество подъездов"
, eon.maxfloors as "Этажность"
, (case when eon.areatype = 0 then 'Частный' when eon.areatype = 1 then 'Не частный' end) as "Тип сектора"
from
	ent_as_house ph 
	left JOIN ENT_OBJECT_NED eon on ph.ob_ned_id = eon.id
	left JOIN ENT_r_rtk fil on fil.id = ph.r_rtk_id
	
where 1=1
	and ph.livestatus = 1
	and ph.mrf_id = 354858663 --Сибирь
	and ph.parent_id is not null
	
order by ph.orponid
;


select  -- выгрузка локальных идентификаторов
sys.external_id as "HouseID"
,ph.orponid as "GlobalID"

from
      ent_as_house ph 
      JOIN ent_id_vs_o_add sys on ph.id = sys.house_id
	
where 1=1
	and ph.livestatus = 1
	and ph.mrf_id = 354858663 --Сибирь
	and ph.parent_id is not null
	and sys.system_id = 354541532
	and ph.orponid between 1 and 15000000
order by ph.orponid
;


Первый запрос выдает все дома по указанным фильтрам. Второй выдает локальные идентификаторы только по тем домам, которые были выгружены во внешние системы.
Мне в итоге нужна одна таблица, чтобы локальные идентификаторы подтягивались по записям первого запроса (если локального идентификатора нет, то значение должно быть пустым). Left Join почему-то не работает.

Подскажите, пожалуйста, как правильно составить запрос.

Сообщение было отредактировано: 24 дек 18, 23:23
24 дек 18, 14:16    [21772088]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
iiyama
Member

Откуда:
Сообщений: 642
*Ann*,
не проверял
+

;with AllData AS
(
select -- выгрузка без связи с локальным идентификатором
ph.orponid as "GlobalID"
, fil.name as "Филиал"
, ph.adr_adm_ter as "Адрес"
, eon.placecnt as "Квартир/офисов"
, eon.kol_pod as "Количество подъездов"
, eon.maxfloors as "Этажность"
, (case when eon.areatype = 0 then 'Частный' when eon.areatype = 1 then 'Не частный' end) as "Тип сектора"
from
ent_as_house ph 
left JOIN ENT_OBJECT_NED eon on ph.ob_ned_id = eon.id
left JOIN ENT_r_rtk fil on fil.id = ph.r_rtk_id

where 1=1
and ph.livestatus = 1
and ph.mrf_id = 354858663 --Сибирь
and ph.parent_id is not null

), ExData AS
(
select -- выгрузка локальных идентификаторов
sys.external_id as "HouseID"
,ph.orponid as "GlobalID"

from
ent_as_house ph 
JOIN ent_id_vs_o_add sys on ph.id = sys.house_id

where 1=1
and ph.livestatus = 1
and ph.mrf_id = 354858663 --Сибирь
and ph.parent_id is not null
and sys.system_id = 354541532
and ph.orponid between 1 and 15000000
)
select 
	* 
from AllData a
	LEFT JOIn ExData e ON a.GlobalID = e.GlobalID
ORDER BY a.GlobalID

24 дек 18, 14:43    [21772149]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
*Ann*
Member

Откуда:
Сообщений: 94
iiyama, спасибо за ответ. Но не помогло :) слишком много каких-то непонятных записей выводится, не удовлетворяющих фильтрам.
25 дек 18, 04:02    [21772628]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
*Ann*
Member

Откуда:
Сообщений: 94
Если в первый запрос вставить подзапрос, то записей выдается верное количество, но поле House_id пустое:

select -- выгрузка без связи с локальным идентификатором
ph.orponid as "GlobalID"
, (select sys.external_id from ent_id_vs_o_add sys where id = sys.house_id and sys.system_id = 354541532) as "House_id"
....


Подскажите, пожалуйста, где ошибка.
25 дек 18, 04:45    [21772629]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
*Ann*
Member

Откуда:
Сообщений: 94
Все, разобралась. В подзапросе кое-что неправильно написала. Всем спасибо за участие.
25 дек 18, 05:10    [21772632]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
*Ann*
Member

Откуда:
Сообщений: 94
Не, не разобралась :(
С подзапросом работает только на ограниченном количестве записей. Если не ограничивать количество, то ошибка о том, что подзапрос вернул больше чем одну запись...
Может кто-нибудь подсказать как правильно сделать?
25 дек 18, 05:39    [21772634]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Вот смотрю я на это все и думаю... А отвернусь и все - мысль ушла. ©ФД

Что то подтягивается на локальных идентификаторах значения, которое должно быть пустым. Много непонятных записей.

Попробуйте более четко сформулировать что у вас происходит и что вы хотите получить, и, я уверен, сразу поймёте как это сделать.
25 дек 18, 07:07    [21772639]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
*Ann*
Member

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

Есть таблица с адресами и есть таблица с ID из внешних систем, в которые этот адрес экспортировался. Как оказалось один адрес может быть экспортировать в одну внешнюю систему несколько раз с разными ID. Мне нужно получить список адресов и ID определённой внешней системы. Если адрес экспортировался в эту систему несколько раз, то записей с этим адресом должно быть несколько, если ни разу, то запись должна быть одна со значением null вместо идентификатора,если адрес выгружался в другую систему (не ту, которая нас интересует), то тоже строка с адресом в выгрузке должна присутствовать со значением null вместо идентификатора.

Пока ничего хорошего не получается.
25 дек 18, 08:59    [21772662]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
*Ann*
Как оказалось один адрес может быть экспортировать в одну внешнюю систему несколько раз с разными ID.

Ну у вас же есть ключ, по которому можно соединить запись базы из которой экспортировали и базы в которую экспортировали?

*Ann*
Мне нужно получить список адресов и ID определённой внешней системы... записей с этим адресом должно быть несколько

*Ann*
если адрес выгружался в другую систему , то тоже строка с адресом в выгрузке должна присутствовать


То есть вам нужно получить полную выборку всех адресов.

К которому сделать джойн (left) выборки из одной "внешней системы" по их общему ключу (условие 1)

Все, что будет без джойна будет присутствовать в выборке (условие 2)

*Ann*
если ни разу, то запись должна быть одна со значением null вместо идентификатора,если адрес выгружался в другую систему (не ту, которая нас интересует), то тоже строка с адресом в выгрузке должна присутствовать со значением null вместо идентификатора.


Тут нужно уточнение: вам не нужно отличать записи из "определенной системы", которые не были экспортированы и записи, которые были экспортированы, но в другие системы; или же если запись не была экспортирована в другие системы то она не должна появляться в списке вообще?
25 дек 18, 09:36    [21772671]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
*Ann*
Member

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

На примере попробую объяснить:
Таблица адресов содержит значения:
Адрес1, Адрес2, Адрес3, Адрес4
Есть три внешние системы: С1, С2, С3

В таблице связей могут быть следующие значения:
Адрес Система Идентификатор в этой системе
Адрес1 С1 1111
Адрес1 С2 1222
Адрес1 С3 1333
Адрес2 С2 2222
Адрес3 С3 3222
Адрес3 С1 3111
Адрес3 С1 3112

Мне нужно выбрать идентификаторы системы С1, если их нет, то просто должна быть строка с Адресом, либо если идентификатора 2 или больше то строк с адресом должно быть столько же.

Адрес1 С1 1111
Адрес2 null null
Адрес3 С1 3112
Адрес3 С1 3111
Адрес4 null null
25 дек 18, 09:56    [21772687]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
*Ann*
Member

Откуда:
Сообщений: 94
Попробовала вот так:

with AllData as (
select
ph.orponid as GlobalID
, sys.external_id as "HouseID"
, sys.system_id as SystemID
, fil.name as "Филиал"
, ph.adr_adm_ter as "Адрес"
, eon.placecnt as "Квартир/офисов"
, eon.kol_pod as "Количество подъездов"
, eon.maxfloors as "Этажность"
, (case when eon.areatype = 0 then 'Частный' when eon.areatype = 1 then 'Не частный' end) as "Тип сектора"
from
ent_as_house ph
left JOIN ENT_OBJECT_NED eon on ph.ob_ned_id = eon.id
left JOIN ENT_r_rtk fil on fil.id = ph.r_rtk_id
left JOIN ent_id_vs_o_add sys on ph.id = sys.house_id

where 1=1
and ph.livestatus = 1
and ph.mrf_id = 354 --Сибирь
and ph.parent_id is not null
order by ph.orponid
)

select * from AllData
where systemid = 35454
or systemid is null
order by GlobalID

1. Этот запрос выдает адреса, которые не экспортировались ни в одну систему, и те, которые экспортировались.
2. Но если в нужной системе два идентификатора, то выдается только один из них.
3. Если адрес экспортировался в системы, отличные от заданной в where, то этот адрес не выдается совсем.
Мне второй и третий пункт надо как-то исправить. Пока не придумалось как.
25 дек 18, 10:03    [21772692]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Если по вашему примеру. Есть две таблицы:

таблица адресов
Адрес
Адрес 1
Адрес 2
Адрес n

и таблица связей
Адрес система внешний айди
Адрес 1 система n айди
Адрес 2 система n айди
Адрес n система n айди

Связаны они между собой только по полю Адрес.

Выбираете все из таблицы адресов и по полю Адрес left join таблицу связей с условием поле система = чему то (например on таблица1.Адрес = таблица2. Адрес and таблица 2.система=с1. Получаете именно то, что вы хотите.

Но честно говоря, эта модель с кодом, который вы показываете никак не сходится.
25 дек 18, 10:27    [21772711]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Если убрать лишнее, то можно начать с

select 
ph.adr_adm_ter as "Адрес"
, ph.orponid as GlobalID
, sys.external_id as "HouseID"
, sys.system_id as SystemID


from
ent_as_house ph 
left JOIN ent_id_vs_o_add sys on ph.id = sys.house_id
And sys.system_id = 35454

--where 1=1 
--and ph.livestatus = 1
--and ph.mrf_id = 354 --Сибирь
--and ph.parent_id is not null
--order by ph.orponid
25 дек 18, 10:37    [21772717]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с left join  [new]
*Ann*
Member

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

Огромное Вам спасибо! Последний Ваш вариант заработал, выдаёт все варианты. Надо было просто фильтр по системе перенести в left join.
25 дек 18, 11:25    [21772763]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить