powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Применение exists в select (SQL)
23 сообщений из 23, страница 1 из 1
Применение exists в select (SQL)
    #40142947
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста, как составить встроенный в powerscript запрос select для ответа на вопрос есть ли хоть одна запись в таблице Х, удовлетворяющая заданному условию where (z) ?
...
Изменено: 08.03.2026, 10:22 - Soft54
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142954
NaDivane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Soft54 [игнорируется] 

Двойственный вопрос получился. В заголовке EXISTS, а в сообщении - существует ли запись?
Для проверки существование строки в таблице X имея условия Z, EXIST не нужен, за исключениями где в аргументы условий Z входят данные из других таблиц.
Уточните вопрос.
...
Изменено: 09.03.2026, 11:43 - NaDivane
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142955
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вставить exists(<подзапрос>) в качестве условия where основного запроса. Правда, это считается дурным тоном.
Например:
select * from Table1 where exists(select * from Table2 where (z))
Такой запрос вернёт записи из Table1 только в том случае, если Table2 содержит хотя бы одну запись, удовлетворяющую условию z.

P.S. Важное замечание. Лично у меня опыта работы с PowerBuilder нет. Но такой SQL-запрос будет работать на многих разных SQL-серверах.
...
Изменено: 09.03.2026, 12:46 - Garya
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142957
NaDivane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garya  09.03.2026, 12:43
[игнорируется]
Правда, это считается дурным тоном.
Если не тяжело, объясните почему это считается дурным тоном?
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142958
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaDivane  09.03.2026, 13:47
[игнорируется]
Если не тяжело, объясните почему это считается дурным тоном?
Некоторые SQL-серверы не имеют достаточно продвинутых средств оптимизации запросов. Поэтому подобный запрос могут выполнять условие where главного запроса "тупо в лоб" для каждой его строки, чтобы определить, должна ли каждая строка таблицы Table1 быть включена в итоговую выборку. Таким образом, подзапрос может запускаться столько раз, сколько строк содержит Table1, что может привести к существенному увеличению времени выполнения подобного запроса.
MS SQL Server умеет сам преобразовывать многие запросы с подзапросом в запросы иного вида, использующие конструкции "inner join", "left join" или "right join", а также "понимать", что подзапрос достаточно выполнить один раз и использовать возвращённый им результат для всех строк основного запроса. Насколько продвинут в этом отношении используемый SQL Server, я представляю плохо.
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142959
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garya  09.03.2026, 12:43
[игнорируется]
select * from Table1 where exists(select * from Table2 where (z))
Для некоторых SQL-серверов данный запрос можно преобразовать к виду, в котором НЕ используется exists(), но тоже с подзапросом:
select t1.* from Table1 t1, (select top 1 * from Table2 where (z)) t2
В данном случае задействуется декартово произведение из двух таблиц с алиасами t1 и t2. При этом, если в Table2 существуют записи, удовлетворяющие условию z, то будет возвращена ровно одна любая из них в подзапрос с алиасом t2. Если в Table2 нет таких записей, то в алиасе t2 будет 0 записей. Декартово произведение возвращает число записей из алиаса t1 помноженное на число записей в алиасе t2. Таким образом каждая запись из Table1 выводится либо 1, либо 0 раз.

Предупреждение: конструкция "select top" в подзапросах работает не на всех SQL серверах.
...
Изменено: 09.03.2026, 14:17 - Garya
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142960
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю за участие, сообщения, подсказки ))
Через несколько минут уточню задачу , идея в том чтобы не применять select count (*) into : row_count from table_a as t where t.staus = 0 and t.issled_end < today(*);
так как важно не количество строк, а есть такие строки или нет чтобы ответить на вопрос выполнять update для этой таблицы - если row_count >= 1 , то обновлять и заменить t.satua на 1 по этому же условию. Извините за этот "длинный" текст, нет рядом компьютера чтобы просто скопировать код процедуры обновления статуса строки )
...
Изменено: 09.03.2026, 15:25 - Soft54
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142961
NaDivane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garya  09.03.2026, 13:59
[игнорируется]
Некоторые SQL-серверы не имеют достаточно продвинутых средств оптимизации запросов.
Тогда это может считаться плохим тоном при использовании только определенных SQL серверов.
Хотя для меня это больше выглядит как неправильно выбранное средство при разработке.
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142962
NaDivane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garya  09.03.2026, 14:14
[игнорируется]
Для некоторых SQL-серверов данный запрос можно преобразовать к виду, в котором НЕ используется exists(), но тоже с подзапросом:
select t1.* from Table1 t1, (select top 1 * from Table2 where (z)) t2
С такими серверами SQL не встречался. Скорее всего либо древние версии, либо хз. Но таких серверов SQL лучше избегать.
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142964
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garya [игнорируется] 

В PowerBuilder (в его языке программирования) применяется стандартный "встроенный SQL" (который делится на статический и динамический). Синтаксис встроенного SQL входит в стандарт SQL 92
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142965
NaDivane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Soft54  09.03.2026, 15:03
[игнорируется]
так как важно не количество строк, а есть такие строки или нет
Можно используя sqlca.sqlcode.
Синтаксис может отличаться в зависимости от используемого SQL сервера.
Код: VB.Net
1.
2.
3.
4.
5.
6.
7.
8.
Long      ll_ex

select first 1 into :ll_ex from X where X = :Z;
if sqlca.sqlcode = 100 then
    // Запись отсутствует.
elseif sqlca.sqlcode = 0 then
    // ...
end if
...
Изменено: 09.03.2026, 15:53 - NaDivane
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142966
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaDivane [игнорируется] 

Как Вы думаете будет ли select 1 from t where z
быстрее чем select count (*) from t where z?
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142967
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaDivane  09.03.2026, 15:47
[игнорируется]
Soft54  09.03.2026, 15:03
[игнорируется]
так как важно не количество строк, а есть такие строки или нет
Можно используя sqlca.sqlcode.
Синтаксис может отличаться в зависимости от используемого SQL сервера.
Код: VB.Net
1.
2.
3.
4.
5.
6.
7.
8.
Long      ll_ex

select first 1 into :ll_ex from X where X = :Z;
if sqlca.sqlcode = 100 then
    // Запись отсутствует.
elseif sqlca.sqlcode = 0 then
    // ...
end if
Аналогичный код я проверял и он работает, только sqlca.sqlcode равен -1 если в таблице больше одной соответствующей записи , но проблема не в этом, а будет ли это быстрее чем count ?
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142971
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Soft54  09.03.2026, 16:00
[игнорируется]
NaDivane [игнорируется] 

Как Вы думаете будет ли select 1 from t where z
быстрее чем select count (*) from t where z?
Наверное, всё-таки первый запрос вот такой: select sum(1) from t where z

Для MS SQL Server для обеих запросов строится одинаковый план выполнения, если есть условие where, и работают они, соответственно с одной скоростью. А вот если нет условия where, то второй быстрее, потому что число записей SQL-сервер "знает", оно хранится в свойствах таблицы.
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142972
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaDivane  09.03.2026, 15:47
[игнорируется]
Интересно если в ваш код добавить
Distinct то, по логике, select должен вернуть одну запись? Будет ли это быстрей? "вот в чем вопрос" ))

[ code=vb]
Long ll_ex

select distinct 1 into :ll_ex from X where X = :Z;
if sqlca.sqlcode = 100 then
// Запись отсутствует.
elseif sqlca.sqlcode = 0 then
// ...
end if[/code]
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142973
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garya [игнорируется] 

Не проверял, но думаю, что запрос select count(*) from t where z;
будет работать быстрее чем
select sum(1) from t where z;
Исхожу из того что count (*) специально для этого предназначен - для подсчёта количества строк .
Признаю, что решение через sum(1)
- творческое решение ))
...
Изменено: 09.03.2026, 18:24 - Soft54
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142974
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут я и вспомнил про предикат exists, может он поможет прервать выполнение select после того как первая строка соответствующая условию Z будет найдена?
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142978
NaDivane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Soft54  09.03.2026, 16:00
[игнорируется]
NaDivane [игнорируется] 
Как Вы думаете будет ли select 1 from t where z
быстрее чем select count (*) from t where z?
Однозначно. Но в коде получите ошибку если возвращаемых строк будет больше одной.
Soft54  09.03.2026, 16:08
[игнорируется]
только sqlca.sqlcode равен -1 если в таблице больше одной соответствующей записи
Для этого и указано условие выборки только первой строки: select first 1
Максимум что может быть в определенных ситуациях, предупреждение о недетерминированном результате, при работе в скрипте не выскакивает предупреждение.
Soft54  09.03.2026, 18:07
[игнорируется]
Интересно если в ваш код добавить
Distinct то, по логике, select должен вернуть одну запись? Будет ли это быстрей? "вот в чем вопрос" ))
Мой код и так вернет одну запись, так как в условии указано вернуть одну первую запись. Вы же пытаетесь переизобрести велосипед. Вопрос зачем это делать, вместо того чтоб решать свою задачу? Что быстрее будет Row Limit или Distinct Order? Возьмите Plan запроса и проанализируйте. Если вы боретесь за каждый такт процессора, используйте Row Limit.
...
Изменено: 10.03.2026, 10:48 - NaDivane
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142980
NaDivane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Soft54  09.03.2026, 18:18
[игнорируется]
Garya [игнорируется] 
Не проверял, но думаю, что запрос select count(*) from t where z;
будет работать быстрее чем
select sum(1) from t where z;
Исхожу из того что count (*) специально для этого предназначен - для подсчёта количества строк .
Признаю, что решение через sum(1)
- творческое решение ))
Время выполнения зависит от используемого SQL сервера, условий запроса, размера таблицы, возможностей оптимизатора и т.д. Если поля содержат индекс и поиск осуществляется по ним, то скорее всего время выполнения запроса будет +- одинаковым, если нет, однозначно ROW LIMIT.
Поиск по индексированным полям таблица порядка 1.12 млн записей:
Спойлер
изображение_2026-03-10_103510770.png
Другой SQL сервер, время ROW LIMIT и COUNT(*) при наличии индекса и поиску по нему идентичное, поиск по неиндексированным полям на скриншоте, таблица порядка 330 тыс. записей:
Спойлер
изображение_2026-03-10_103755184.png
...
Изменено: 10.03.2026, 11:47 - NaDivane
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142981
NaDivane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Soft54  09.03.2026, 18:51
[игнорируется]
Тут я и вспомнил про предикат exists, может он поможет прервать выполнение select после того как первая строка соответствующая условию Z будет найдена?
Нет, SQL запрос выдаст столько строк сколько соответствует условиям. По любому Row Limit или Count().
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40142997
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaDivane [игнорируется] 

Благодарю за подсказку - first , работает и sqlca.sqlcode = 0 или 100.
К тому же оказался самым быстрым!
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40143004
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код с применение EXISTS
будет выглядеть так:
dummy_value = false
SELECT first 1 INTO :dummy_value
FROM "dba"."issledovan_arx" t
WHERE EXISTS ( SELECT first 1
FROM "dba"."issledovan_arx" h
WHERE ("h"."issled_id_1" = "t"."issled_id_1" and ( "h"."history_status" = 0 AND "h"."date_issled" < today(*) ))) ;
...
Рейтинг: 0 / 0
Применение exists в select (SQL)
    #40143005
Soft54
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последний пример - "маслом масленое", для случая - если бы таблицы (t и h) были разные
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Применение exists в select (SQL)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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