powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Странный вывод запроса.
22 сообщений из 22, страница 1 из 1
Странный вывод запроса.
    #39462423
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В базе данных построены два запроса, каждый из которых собирает некоторый набор записей.
Эти запросы используются как источник данных третьего запроса, причём применяется LEFT JOIN. Соответственно я ожидаю, что для тех записей одного подзапроса, которым нет соответствия во втором подзапросе, на месте полей вывода из второго подзапроса будет Null... а вот хрен! И я не понимаю, почему...

Теперь конкретно.

Вот первый подзапрос
SubQuery1
Код: sql
1.
2.
3.
SELECT Панели.Наименование & ' - ' & Порты.Порт AS Порт1, Порты.Код
FROM Панели 
INNER JOIN Порты ON Панели.Код = Порты.Панель


Вот второй подзапрос
SubQuery2
Код: sql
1.
2.
3.
4.
5.
6.
SELECT Кроссировки.Порт1, Панели.Наименование & ' - ' & Порты.Порт AS Порт2
FROM Панели 
INNER JOIN 	(
			Порты 
			INNER JOIN Кроссировки ON Порты.Код = Кроссировки.Порт2
			) ON Панели.Код = Порты.Панель


Вот запрос, использующий их:
Кроссирование-1
Код: sql
1.
2.
3.
SELECT SubQuery1.Порт1 AS Порт1, SubQuery2.Порт2 AS Порт2, SubQuery1.Код AS Код1, SubQuery2.Порт1 AS Код2
FROM SubQuery1 
LEFT JOIN SubQuery2 ON SubQuery1.Код = SubQuery2.Порт1;


или он же, но с подстановкой текста:
Кроссирование-2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT SubQuery1.Порт1 AS Порт1, SubQuery2.Порт2 AS Порт2, SubQuery1.Код AS Код1, SubQuery2.Порт1 AS Код2
FROM 	(
		SELECT Панели.Наименование & ' - ' & Порты.Порт AS Порт1, Порты.Код
		FROM Панели 
		INNER JOIN Порты ON Панели.Код = Порты.Панель
		) AS SubQuery1 
LEFT JOIN 	(
			SELECT Кроссировки.Порт1, Панели.Наименование & ' - ' & Порты.Порт AS Порт2
			FROM Панели 
			INNER JOIN 	(
						Порты 
						INNER JOIN Кроссировки ON Порты.Код = Кроссировки.Порт2
						) ON Панели.Код = Порты.Панель
			) AS SubQuery2 ON SubQuery1.Код = SubQuery2.Порт1;



Понятно, для тех записей первого подзапроса, которым нет соответствия во втором, я в полях SubQuery2.Порт2 AS Порт2 и SubQuery2.Порт1 AS Код2 ожидаю увидеть Null... и в поле SubQuery2.Порт1 AS Код2 я этот Null и получаю... но вижу вместо него в поле SubQuery2.Порт2 AS Порт2 литерал " - ".

Наблюдение демонстрирует скриншот ("Кроссирование-2" - это имя сохранённого статически последнего запроса, который с подстановками).

ПОЧЕМУ???
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462464
Akinaв поле SubQuery2.Порт1 AS Код2 я этот Null и получаю... но вижу вместо него в поле SubQuery2.Порт2 AS Порт2 литерал " - "
Поробуйте вместо:
Панели.Наименование & ' - ' & Порты.Порт
Написать:
Панели.Наименование + ' - ' & Порты.Порт
Или (если поле "Порт" не числовое):
Панели.Наименование + ' - ' + Порты.Порт
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462515
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев ) , вывод не изменился...
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462570
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

а так ?
Код: sql
1.
... SELECT Кроссировки.Порт1, iif (trim(Панели.Наименование & ' - ' & Порты.Порт)="-", Null, Панели.Наименование & ' - ' & Порты.Порт) AS Порт2 ...
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462650
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как этого избежать - и так ясно
Код: sql
1.
IIF(IsNull(SubQuery2.Код2), SubQuery2.Код2, SubQuery2.Порт2) AS Порт2


Но непонятно, какого хрена...
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462653
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
автор...ПОЧЕМУ???...
если не получилось, как советовал Анатолий, то, предполагаю , что там Empty , а не Null
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
?Null & " - " & Null
 - 
?Null + " - " & Null
Null
?Null + " - " + Null
Null
?Empty & " - " & Null
 - 
?Empty + " - " & Null
 - 
?Empty + " - " + Null
Null
?Empty & " - " & Empty
 - 
?Empty + " - " & Empty
 - 
?Empty + " - " + Empty
 - 
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462669
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportпредполагаю , что там Empty , а не NullПосмотри на скриншоте, какой код получает данные. Поле DAO-рекордсета не может вернуть Empty... Равно как и при LEFT JOIN для не имеющих соответствия записей в полях никак не может быть Empty.
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462675
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
лень пример делать... может выложишь кусочек базы с этой проблемкой (mdb)?
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462697
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
сделал примерчик по образу и подобию, проверил совет Анатолия - всё работает как надо ... зря пример не прилагаешь, долго можно без него гадать в чем проблема...
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462789
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimportAkina,
сделал примерчик по образу и подобию, проверил совет Анатолия - всё работает как надо ... зря пример не прилагаешь, долго можно без него гадать в чем проблема...
на всякий случай примерчик приложу
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462819
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкладываю почищенную от ненужного хлама БД.
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462825
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
у меня твой пример работает без проблем (access 2003, только поправил запрос "Кроссирование-2" так, как советовал Анатолий)
[/SRC]
SELECT SubQuery1.Порт1 AS Порт1, SubQuery2.Порт2 AS Порт2, SubQuery1.Код AS Код1, SubQuery2.Порт1 AS Код2
FROM [SELECT Панели.Наименование & ' - ' & Порты.Порт AS Порт1, Порты.Код
FROM Панели
INNER JOIN Порты ON Панели.Код = Порты.Панель
]. AS SubQuery1 LEFT JOIN [SELECT Кроссировки.Порт1, Панели.Наименование >>> + <<< ' - ' & Порты.Порт AS Порт2
FROM Панели
INNER JOIN (
Порты
INNER JOIN Кроссировки ON Порты.Код = Кроссировки.Порт2
) ON Панели.Код = Порты.Панель
]. AS SubQuery2 ON SubQuery1.Код = SubQuery2.Порт1;
[/SRC]
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462827
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT SubQuery1.Порт1 AS Порт1, SubQuery2.Порт2 AS Порт2, SubQuery1.Код AS Код1, SubQuery2.Порт1 AS Код2
FROM [SELECT Панели.Наименование & ' - ' & Порты.Порт AS Порт1, Порты.Код
		FROM Панели 
		INNER JOIN Порты ON Панели.Код = Порты.Панель
		]. AS SubQuery1 LEFT JOIN [SELECT Кроссировки.Порт1, Панели.Наименование  +  ' - ' & Порты.Порт AS Порт2
			FROM Панели 
			INNER JOIN 	(
						Порты 
						INNER JOIN Кроссировки ON Порты.Код = Кроссировки.Порт2
						) ON Панели.Код = Порты.Панель
			]. AS SubQuery2 ON SubQuery1.Код = SubQuery2.Порт1;
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462840
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport , спасибо. КАК исправить - решено.

Осталось понять, ПОЧЕМУ в исходном виде результат далёк от ожидаемого. И соответственно ПОЧЕМУ внесённые изменения исправили вывод.
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462845
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina guest_rusimport , спасибо. КАК исправить - решено.

Осталось понять, ПОЧЕМУ в исходном виде результат далёк от ожидаемого. И соответственно ПОЧЕМУ внесённые изменения исправили вывод.
Ну, так "+" и "&" по разному работают , я же выше приводил результат
Код: vbnet
1.
2.
3.
4.
?Null & " - " & Null
 - 
?Null + " - " & Null
Null
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462850
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462862
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimport , это не объясняет появления не-Null значений в запросе Кроссирование-1 из начального сообщения. Или остаётся предположить, что движок вместо выполнения указанного запроса выполняет подстановку текстов подзапросов, что и приводит к неправильному результату.

И уж тем более не объясняет, почему вместо добавления Null-значений во все поля правой таблицы для отсутствующих записей производится вычисление выражения с использованием Null-значения.
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462883
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
а по-моему всё очень логично, иначе бы Анатолий не заметил это сразу... кстати, может он сам более понятнее объяснит
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462888
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportпо-моему всё очень логично
Не вижу логики в том что в запросе
Код: vbnet
1.
2.
3.
SELECT t1.f1, t1.f2, t2.f1, t2.f2
FROM t1 LEFT JOIN t2 ON t1.f1=t2.f1
WHERE t2.f1 IS NULL

в поле t2.f2 оказываются не-NULL...
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462897
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaguest_rusimportпо-моему всё очень логично
Не вижу логики в том что в запросе
Код: vbnet
1.
2.
3.
SELECT t1.f1, t1.f2, t2.f1, t2.f2
FROM t1 LEFT JOIN t2 ON t1.f1=t2.f1
WHERE t2.f1 IS NULL

в поле t2.f2 оказываются не-NULL...
у вас это поле конкатенируется из трех слагаемых в подзапросе, два из которых при левом внешнем объединении равны NULL ... в этой конкатенации и всё дело
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462903
йцкйцк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaguest_rusimportпо-моему всё очень логично
Не вижу логики в том что в запросе


Это бага Акцесса, тут было похожее .
...
Рейтинг: 0 / 0
Странный вывод запроса.
    #39462917
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest_rusimportу вас это поле конкатенируется из трех слагаемых в подзапросе, два из которых при левом внешнем объединении равны NULLВот мне и странно, что конкатенация выполняется ПОСЛЕ связывания, что не соответствует тексту запроса.

йцкйцкЭто бага АкцессаУже тоже пришёл к этому выводу.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Странный вывод запроса.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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