Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10

Табличная функция, возвращающая N полей по N переданным ключам

25.07.2024, 10:24. Показов 1186. Ответов 22

Приветствую!
Друзья, прошу помочь со следующей задачей: есть функция (пример под спойлером), принимающая 3 ID и возвращающая одну строку с 3мя полями — поле text из одной и той же таблицы для каждого из переданных ID.
Я её реализовал с помощью CrossJoin. Насколько это правильно/эффективно? Как бы вы сделали?
Func
T-SQL
1
2
3
4
5
6
7
8
9
10
Drop Function If Exists dbo.Get3TextBy3ID
Go
Create Function dbo.Get3TextBy3ID(@TextID_1 Int, @TextID_2 Int, @TextID_3 Int)  -- Принимает 3 ID текста из таблицы «dbo.sku_text».
Returns Table                                                                   -- Возвращает таблицу (0 строк или 1 строка) с 3мя полями «text» из таблицы «dbo.sku_text».
As Return                                                                       -- Если хотя бы один TextID не найден, ничего не вернёт (пустое множество).
    With    A As(Select Top(1) text As Tx1 From dbo.sku_text With(NoLock, ForceSeek) Where id = @TextID_1),
            B As(Select Top(1) text As Tx2 From dbo.sku_text With(NoLock, ForceSeek) Where id = @TextID_2),
            C As(Select Top(1) text As Tx3 From dbo.sku_text With(NoLock, ForceSeek) Where id = @TextID_3)
    Select Top(1) Tx1, Tx2, Tx3 From A, B, C
Go
Дополнительный вопрос: как сделать оптимально, чтобы функция ВСЕГДА выводила одну строку с 3мя полями, а, в случае, если переданный ID не найден, вместо него было бы Null?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.07.2024, 10:24
Ответы с готовыми решениями:

Функция возвращающая абсолютное разницу первого и второго параметров и функция типа int, возвращающая минимальное из трех целых чисел
Разработать заданные согласно условия функции и сделать в главной программе по два вызова этих функций с различными параметрами. Для...

Табличная форма, блокировка соседних полей строки
Добрый день, уважаемые форумчане. Подскажите пожалуйста. Имеется форма в виде таблицы с флажками(checkbox), при выборе флажка в...

Табличная функция
Доброго времени суток, уважаемые форумчане! Столкнулся с проблемой: Нужно было составить программу для расчета φ(B)=tg(B) на языке...

22
46 / 35 / 11
Регистрация: 16.10.2011
Сообщений: 121
25.07.2024, 13:36
T-SQL
1
2
3
4
5
6
7
WITH cte AS(
        SELECT ID,Name FROM dbo.sku_text WHERE ID IN(@TextID_1,@TextID_2,@TextID_3)
    )
    ,a as (Select Top(1) text As Tx1 From cte With(NoLock, ForceSeek) Where id = @TextID_1)
    ,b as (Select Top(1) text As Tx2 From cte With(NoLock, ForceSeek) Where id = @TextID_2)
    ,c as (Select Top(1) text As Tx3 From cte With(NoLock, ForceSeek) Where id = @TextID_3)
    Select Tx1, Tx2, Tx3 From A, B, C
Добавлено через 19 минут
по крайней мере у меня так чуть быстрее на 5млн+ записей
1
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
25.07.2024, 18:06  [ТС]
k@lYaN, на тестах немного быстрее 1го варианта, но гораздо хуже встраивается в реальную цепочку. Там время сильно больше 1го варианта.
Спасибо за вариант

UPD:
Вот такую ещё конструкцию придумал
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Drop Function If Exists dbo.Get3TextBy3ID_2
Go
Create Function dbo.Get3TextBy3ID_2(@TextID_1 Int, @TextID_2 Int, @TextID_3 Int)    -- Принимает 3 ID текста из таблицы «dbo.sku_text».
Returns Table                                                                   -- Возвращает таблицу (0 строк или 1 строка) с 3мя полями «text» из таблицы «dbo.sku_text».
As Return                                                                       -- Если хотя бы один TextID не найден, ничего не вернёт (пустое множество).
    With
        A As
        (
            Select 1 As N, @TextID_1 As id
            Union All
            Select 2 As N, @TextID_2 As id
            Union All
            Select 3 As N, @TextID_3 As id
        ),
        B As
        (
            Select      A.N, T.text As Tx
            From        A
            Left Join   dbo.sku_text As T With(NoLock) On T.id = A.id
        )
    Select (Select Tx From B Where N = 1) As Tx1, (Select Tx From B Where N = 2) As Tx2, (Select Tx From B Where N = 3) As Tx3
Go
из плюсов — вернёт Null для ненайденных id. В оригинале, если хоть 1 id из переданных не найден, то вернёт пустое множество.
Из минусов — медленно работает. Завтра Pivot попробую.
Интересно протестить одно соединение для N ключей, а не N соединений.
0
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
26.07.2024, 09:56  [ТС]
Вариант с Pivot
T-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
Drop Function If Exists dbo.Get3TextBy3ID_2
Go
Create Function dbo.Get3TextBy3ID_2(@TextID_1 Int, @TextID_2 Int, @TextID_3 Int)    -- Принимает 3 ID текста из таблицы «dbo.sku_text».
Returns Table                                                                       -- Возвращает таблицу (0 строк или 1 строка) с 3мя полями «text» из таблицы «dbo.sku_text».
As Return                                                                           -- Если хотя бы один TextID не найден, ничего не вернёт (пустое множество).
    With
        A As
        (
            Select 1 As N, @TextID_1 As id
            Union All
            Select 2 As N, @TextID_2 As id
            Union All
            Select 3 As N, @TextID_3 As id
        ),
        B As
        (
            Select      A.N, T.text As Tx
            From        A
            Inner Join  dbo.sku_text As T With(NoLock) On T.id = A.id
        )
    Select  [1] As Tx1, [2] As Tx2, [3] As Tx3
    From    B
    Pivot   (Min(Tx) For N In ([1],[2],[3])) As P
Go
скорость никуда не годится. Пока останавливаюсь на первоначальном варианте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2024, 09:56

Табличная функция
Протабулировать функцию y = {tg}^{2}|x|+{3}^{2x^2} на отрезке с шагом 0,6.

Табличная функция
Здравствуйте, нужно создать многострочную табличнозначную функцию пользователя для расчета процента цены(поле "Цена") каждой...

Табличная функция
Помогите протабулировать функцию на С++ y=\sqrt{\frac{\mid x\mid }{2.69+{x}^{2}+{x}^{4}}} на отрезке с шагом 0,7. Заранее большое...

Табличная функция
Есть таблица с одним столбцом. В функции передаю два строковых массива со словами разделенными запятой, первый строковый массив- имена, а...

Табличная функция
Написать программу, которая выводит таблицу значений функции у=|x-2|+|x+l|. Диапазон изменения аргумента от -4 до 4, шаг приращения ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru