#sql #sql-server #tsql
Вопрос:
У меня есть таблица, в которой есть эти столбцы
a_Max b_Max ------------------------- ,LOG,RF, ,GNB,LOG,SVC ,SVC, ,RF,SVC, ,LOG ,RF,GNB,
Есть ли простой способ найти и то, и другое a_Max
и b_Max
поделиться каким-либо именем функции?
итак ,ЖУРНАЛ,RF, amp; ,GNB,ЖУРНАЛ,SVC, общий алгоритм ведения журнала
,SVC, amp; ,RF,SVC, общий алгоритм SVC
,ЖУРНАЛ, amp; ,RF,GNB, общие алгоритмы отсутствуют
a_Max b_Max ShareAlg ----------------------------------------- ,LOG,RF, ,GNB,LOG,SVC, 1 ,SVC, ,RF,SVC, 1 ,LOG, ,RF,GNB, 0
Я построил скалярную функцию для сравнения обоих результатов string_split
, но это слишком медленно. Интересно, есть ли более быстрый способ
Комментарии:
1. Вам нужно показать нам, что вы уже сделали, чтобы предложить более быстрое решение. Кроме того, если вы предоставляете свои примерные данные в формате DDL DML, людям будет намного проще отвечать.
Ответ №1:
Скалярные функции могут снижать производительность. Если вам необходимо использовать функцию, сначала рассмотрите функцию с табличным значением.
Существуют штрафы за хранение данных с разделителями… РАНО ИЛИ ПОЗДНО ЧТО-ТО ПРИДЕТСЯ АНАЛИЗИРОВАТЬ.
Однако вот вариант, для которого не требуется SVF или TVF.
ПРИМЕЧАНИЕ: Не видя вашей функции, трудно сказать, будет ли она более эффективной.
Пример
Select * From YourTable A Cross Apply ( Select SharAlg = count(*) from string_split(a_Max,',') B1 Join string_split(b_Max,',') B2 on B1.Value=B2.Value and B1.Valuelt;gt;'' ) B
Результаты
a_Max b_Max SharAlg ,LOG,RF, ,GNB,LOG,SVC 1 ,SVC, ,RF,SVC, 1 ,LOG ,RF,GNB, 0