Гость
Map
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Чем заменить cross apply top 1 ? / 7 сообщений из 7, страница 1 из 1
25.06.2021, 18:47
    #40080203
Кесарь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить cross apply top 1 ?
Коллеги, осваиваю ASE версия Adaptive Server Enterprise/16.0 GA PL01/EBF 22540 SMP/P/X64/Windows Server/ase160sp00pl01/3523/64-bit/FBO/Tue Apr 15 19:04:17 2014

так вот многие привычные вещи тут отсутствуют. В то числе cross apply. Пытаюсь их заменить на подзапросы и на зависимые запросы. И опять ничего не выходит.

Вот так не работает в обоих вариантах. Вывести нужно соббсно одну строку из зависимого запроса на каждую строку родительского набора (то что в сиквеле делается через cross aplly (select top 1 order by...) ).

Как это делается в АСЕ ???


Код: 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.
DECLARE @contract_id INT, @client_id INT, @contr_delivery_id INT, @debitor_id INT
DECLARE @c_restricttype_7   int

SET @contract_id = 1900690
SET @debitor_id = 11584
SELECT @c_restricttype_7 = 7

SELECT
  cdr.*,
  (SELECT TOP 1
     fr.value_1
   FROM f_restrict fr
   WHERE fr.f_client = cdr.f_client AND
         fr.f_contr = cdr.f_contr_line   AND        
         fr.c_restricttype = @c_restricttype_7)
FROM f_client_debt_recv cdr
WHERE cdr.f_client = @debitor_id
  AND cdr.f_contr_line = @contract_id


SELECT *
FROM f_client_debt_recv cdr
  join (SELECT TOP 1
     fr.value_1
   FROM f_restrict fr
   WHERE fr.f_client = cdr.f_client AND
        fr.f_contr = cdr.f_contr_line   AND        
         fr.c_restricttype = @c_restricttype_7 ) f ON 1=1
WHERE cdr.f_client = @debitor_id
  AND cdr.f_contr_line = @contract_id
...
Рейтинг: 0 / 0
25.06.2021, 19:18
    #40080207
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить cross apply top 1 ?
Кесарь
Вот так не работает в обоих вариантах. Вывести нужно соббсно одну строку из зависимого запроса на каждую строку родительского набора (то что в сиквеле делается через cross aplly (select top 1 order by...) ).
В "сиквеле" так не делается. Так можно сделать в SQL Server - делать так идиотизм, но сделать можно.

Вот, полное соответствие:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT * FROM TableA A
CROSS APPLY 
   ( 
   SELECT * FROM TableB B
   WHERE B.aID = A.ID 
   ) A 
GO
 
SELECT * FROM TableA A
JOIN TableB B ON B.aID = A.ID 
GO 


При связи один-ко-многим (много строк в B показывают на одну строку в A) ты получишь точно то, что желаешь.


Вообще, использовать apply в SQL Server имеет смысл только в случае join с функциями и очень-очень редко оно может дать небольшой выигрыш в производительности против join.
...
Рейтинг: 0 / 0
25.06.2021, 19:21
    #40080208
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить cross apply top 1 ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT cdr.*, fr.value_1
FROM f_client_debt_recv cdr
JOIN f_restrict fr on
        fr.f_client = cdr.f_client AND
        fr.f_contr = cdr.f_contr_line   AND        
        fr.c_restricttype = @c_restricttype_7
WHERE cdr.f_client = @debitor_id
  AND cdr.f_contr_line = @contract_id
...
Рейтинг: 0 / 0
28.06.2021, 14:08
    #40080497
Кесарь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить cross apply top 1 ?
White Owl
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT cdr.*, fr.value_1
FROM f_client_debt_recv cdr
JOIN f_restrict fr on
        fr.f_client = cdr.f_client AND
        fr.f_contr = cdr.f_contr_line   AND        
        fr.c_restricttype = @c_restricttype_7
WHERE cdr.f_client = @debitor_id
  AND cdr.f_contr_line = @contract_id



Серьёзно что ли? Блин, вот зачем такое вообще писать, усилия прилагать и время тратить???

Этот запрос вернёт классическое пересечение и ничего более. И само собой запись будет не одна.
...
Рейтинг: 0 / 0
28.06.2021, 16:49
    #40080553
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить cross apply top 1 ?
https://www.sql.ru/forum/844750/kak-zadavat-vopros

Давай тестовые данные и показывай на них что ты хочешь получить.
...
Рейтинг: 0 / 0
14.09.2021, 09:45
    #40097470
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить cross apply top 1 ?
Кесарь, н-да, разбаловали народ всякими там cross apply.
В результате логику внутреннюю не могут построить на атомарных операциях.

Много вопросов:
* Вам какую именно строку нужно? Произвольную?
* Датасет большой?
* Индекс есть по fr.value_1 и ключевым полям?

трансформируйте подзапрос

Код: sql
1.
2.
3.
4.
5.
6.
SELECT TOP 1
     fr.value_1
   FROM f_restrict fr
   WHERE fr.f_client = cdr.f_client AND
        fr.f_contr = cdr.f_contr_line   AND        
         fr.c_restricttype = @c_restricttype_7 



в агрегат:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
join 
(
SELECT TOP 1
     fr.f_client, fr.f_contr, fr.c_restricttype, MAX(fr.value_1) as value_1
   FROM f_restrict fr
group by fr.f_client, fr.f_contr, fr.c_restricttype
)
on cdr.f_client AND fr.f_contr = cdr.f_contr_line   AND fr.c_restricttype = @c_restricttype_7



как минимум будет предсказуемо работать запрос, а не выдавать "случайные" значения из ТОР 1 в зависимости от физического хранения информации и прочих фаз луны сатурна и т.п.
...
Рейтинг: 0 / 0
14.09.2021, 09:46
    #40097472
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить cross apply top 1 ?
Mikle83,

тор1 конечно лишний в агрегате
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Чем заменить cross apply top 1 ? / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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