|
|
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуйста, как составить встроенный в powerscript запрос select для ответа на вопрос есть ли хоть одна запись в таблице Х, удовлетворяющая заданному условию where (z) ? ... |
|||
|
:
Изменено: 08.03.2026, 10:22 - Soft54
Нравится:
Не нравится:
|
|||
| 08.03.2026, 10:20 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Можно вставить 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
Нравится:
Не нравится:
|
|||
| 09.03.2026, 12:43 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Правда, это считается дурным тоном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 13:47 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Если не тяжело, объясните почему это считается дурным тоном? MS SQL Server умеет сам преобразовывать многие запросы с подзапросом в запросы иного вида, использующие конструкции "inner join", "left join" или "right join", а также "понимать", что подзапрос достаточно выполнить один раз и использовать возвращённый им результат для всех строк основного запроса. Насколько продвинут в этом отношении используемый SQL Server, я представляю плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 13:59 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
select * from Table1 where exists(select * from Table2 where (z)) 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
Нравится:
Не нравится:
|
|||
| 09.03.2026, 14:14 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Благодарю за участие, сообщения, подсказки )) Через несколько минут уточню задачу , идея в том чтобы не применять 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
Нравится:
Не нравится:
|
|||
| 09.03.2026, 15:03 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Некоторые SQL-серверы не имеют достаточно продвинутых средств оптимизации запросов. Хотя для меня это больше выглядит как неправильно выбранное средство при разработке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 15:14 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Для некоторых SQL-серверов данный запрос можно преобразовать к виду, в котором НЕ используется exists(), но тоже с подзапросом: select t1.* from Table1 t1, (select top 1 * from Table2 where (z)) t2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 15:25 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Garya [игнорируется] В PowerBuilder (в его языке программирования) применяется стандартный "встроенный SQL" (который делится на статический и динамический). Синтаксис встроенного SQL входит в стандарт SQL 92 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 15:43 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
так как важно не количество строк, а есть такие строки или нет Синтаксис может отличаться в зависимости от используемого SQL сервера. Код: VB.Net 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Изменено: 09.03.2026, 15:53 - NaDivane
Нравится:
Не нравится:
|
|||
| 09.03.2026, 15:47 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
NaDivane [игнорируется] Как Вы думаете будет ли select 1 from t where z быстрее чем select count (*) from t where z? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 16:00 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
так как важно не количество строк, а есть такие строки или нет Синтаксис может отличаться в зависимости от используемого SQL сервера. Код: VB.Net 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 16:08 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Наверное, всё-таки первый запрос вот такой: select sum(1) from t where z Для MS SQL Server для обеих запросов строится одинаковый план выполнения, если есть условие where, и работают они, соответственно с одной скоростью. А вот если нет условия where, то второй быстрее, потому что число записей SQL-сервер "знает", оно хранится в свойствах таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 16:55 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Интересно если в ваш код добавить 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] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 18:07 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Garya [игнорируется] Не проверял, но думаю, что запрос select count(*) from t where z; будет работать быстрее чем select sum(1) from t where z; Исхожу из того что count (*) специально для этого предназначен - для подсчёта количества строк . Признаю, что решение через sum(1) - творческое решение )) ... |
|||
|
:
Изменено: 09.03.2026, 18:24 - Soft54
Нравится:
Не нравится:
|
|||
| 09.03.2026, 18:18 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Тут я и вспомнил про предикат exists, может он поможет прервать выполнение select после того как первая строка соответствующая условию Z будет найдена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2026, 18:51 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Однозначно. Но в коде получите ошибку если возвращаемых строк будет больше одной.
только sqlca.sqlcode равен -1 если в таблице больше одной соответствующей записи Максимум что может быть в определенных ситуациях, предупреждение о недетерминированном результате, при работе в скрипте не выскакивает предупреждение. Интересно если в ваш код добавить Distinct то, по логике, select должен вернуть одну запись? Будет ли это быстрей? "вот в чем вопрос" )) ... |
|||
|
:
Изменено: 10.03.2026, 10:48 - NaDivane
Нравится:
Не нравится:
|
|||
| 10.03.2026, 10:45 |
|
||
|
Применение exists в select (SQL)
#40142980
![]() Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
Ссылка на вложение:
Ссылка на вложение 2:
|
|||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
#18+
Время выполнения зависит от используемого SQL сервера, условий запроса, размера таблицы, возможностей оптимизатора и т.д. Если поля содержат индекс и поиск осуществляется по ним, то скорее всего время выполнения запроса будет +- одинаковым, если нет, однозначно ROW LIMIT. Поиск по индексированным полям таблица порядка 1.12 млн записей: Другой SQL сервер, время ROW LIMIT и COUNT(*) при наличии индекса и поиску по нему идентичное, поиск по неиндексированным полям на скриншоте, таблица порядка 330 тыс. записей: ... |
|||||||||||||||||||
|
:
Изменено: 10.03.2026, 11:47 - NaDivane
Нравится:
Не нравится:
|
|||||||||||||||||||
| 10.03.2026, 11:43 |
|
||||||||||||||||||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Тут я и вспомнил про предикат exists, может он поможет прервать выполнение select после того как первая строка соответствующая условию Z будет найдена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2026, 12:11 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
NaDivane [игнорируется] Благодарю за подсказку - first , работает и sqlca.sqlcode = 0 или 100. К тому же оказался самым быстрым! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2026, 15:55 |
|
||
|
Применение exists в select (SQL)
|
|||
|---|---|---|---|
|
#18+
Код с применение 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(*) ))) ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2026, 13:38 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=40142962&tid=2187362]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 244ms |
| total: | 529ms |

| 0 / 0 |
