Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с left join / 14 сообщений из 14, страница 1 из 1
24.12.2018, 14:16
    #39752260
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
Добрый день.
Помогите, пожалуйста, с запросом.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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 почему-то не работает.

Подскажите, пожалуйста, как правильно составить запрос.
...
Рейтинг: 0 / 0
24.12.2018, 14:43
    #39752301
iiyama
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
*Ann*,
не проверял

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
;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


...
Рейтинг: 0 / 0
25.12.2018, 04:02
    #39752575
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
iiyama, спасибо за ответ. Но не помогло :) слишком много каких-то непонятных записей выводится, не удовлетворяющих фильтрам.
...
Рейтинг: 0 / 0
25.12.2018, 04:45
    #39752576
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
Если в первый запрос вставить подзапрос, то записей выдается верное количество, но поле 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"
....


Подскажите, пожалуйста, где ошибка.
...
Рейтинг: 0 / 0
25.12.2018, 05:10
    #39752579
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
Все, разобралась. В подзапросе кое-что неправильно написала. Всем спасибо за участие.
...
Рейтинг: 0 / 0
25.12.2018, 05:39
    #39752581
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
Не, не разобралась :(
С подзапросом работает только на ограниченном количестве записей. Если не ограничивать количество, то ошибка о том, что подзапрос вернул больше чем одну запись...
Может кто-нибудь подсказать как правильно сделать?
...
Рейтинг: 0 / 0
25.12.2018, 07:07
    #39752584
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
Вот смотрю я на это все и думаю... А отвернусь и все - мысль ушла. ©ФД

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

Попробуйте более четко сформулировать что у вас происходит и что вы хотите получить, и, я уверен, сразу поймёте как это сделать.
...
Рейтинг: 0 / 0
25.12.2018, 08:59
    #39752606
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
PizzaPizza,

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

Пока ничего хорошего не получается.
...
Рейтинг: 0 / 0
25.12.2018, 09:36
    #39752611
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
*Ann*Как оказалось один адрес может быть экспортировать в одну внешнюю систему несколько раз с разными ID.
Ну у вас же есть ключ, по которому можно соединить запись базы из которой экспортировали и базы в которую экспортировали?

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

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

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

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

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

Тут нужно уточнение: вам не нужно отличать записи из "определенной системы", которые не были экспортированы и записи, которые были экспортированы, но в другие системы; или же если запись не была экспортирована в другие системы то она не должна появляться в списке вообще?
...
Рейтинг: 0 / 0
25.12.2018, 09:56
    #39752623
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
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
...
Рейтинг: 0 / 0
25.12.2018, 10:03
    #39752626
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
Попробовала вот так:

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, то этот адрес не выдается совсем.
Мне второй и третий пункт надо как-то исправить. Пока не придумалось как.
...
Рейтинг: 0 / 0
25.12.2018, 10:27
    #39752639
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
Если по вашему примеру. Есть две таблицы:

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

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

Но честно говоря, эта модель с кодом, который вы показываете никак не сходится.
...
Рейтинг: 0 / 0
25.12.2018, 10:37
    #39752643
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
Если убрать лишнее, то можно начать с

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
25.12.2018, 11:25
    #39752672
*Ann*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с left join
PizzaPizza,

Огромное Вам спасибо! Последний Ваш вариант заработал, выдаёт все варианты. Надо было просто фильтр по системе перенести в left join.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с left join / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]