Как проверить пересечение подзапросов в запросе? - PullRequest
0 голосов
/ 15 мая 2011

У меня следующий запрос:

SELECT c.client_code, a.account_num, m.account_close_date, u.uso, m.product_name
FROM accounts a INNER JOIN Clients c ON c.id = a.client_id INNER JOIN 
    Uso u ON c.uso_id = u.uso_id INNER JOIN Magazine m ON a.account_id = m.account_id 

и мне нужно сравнить product_name с входным параметром.

product_name и входной параметр @s - это разделенные запятыми строки. Я использую следующую функцию разделения:

ALTER FUNCTION [dbo].[Split] 
(   
    @s VARCHAR(max),
    @split CHAR(1)
)
RETURNS @temptable TABLE (items VARCHAR(MAX))    
AS
BEGIN

DECLARE @x XML

    SELECT @x = CONVERT(xml,'<root><s>' + REPLACE(@s,@split,'</s><s>') + '</s></root>');

    INSERT INTO @temptable          
        SELECT [Value] = T.c.value('.','varchar(20)')
        FROM @X.nodes('/root/s') T(c);
RETURN
END;

Я думаю, что мне нужно проверить пересечение таблиц, которое я получу после разделения product_name и после разделения входного параметра. Я хотел это сделать:

WHERE (select * from dbo.Split(m.product_name, ';') 
INTERSECT select * from dbo.Split('product1;product2',';')) 
is not null

Но это не совсем правильно. Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 15 мая 2011

INTERSECT требует того же вывода столбца и используется как UNION или EXCEPT: не в предложении WHERE

Просто присоединитесь к udf

...
INNER JOIN
Magazine m ON a.account_id = m.account_id
INNER JOIN
dbo.Split(@parameter, ';') CSV ON m.productname = CSV.items

Если вам нужно разделить m.productname, если вы не можете исправить дизайн, используйте CROSS APPLY

...
INNER JOIN
Magazine m ON a.account_id = m.account_id
CROSS APPLY
dbo.Split(m.productname, ';') WTF
INNER JOIN
dbo.Split(@parameter, ';') CSV ON WTF.items = CSV.items

Однако, JOIN и INTERSECT дают разные результаты, если @parameter имеет дублированные значения.Например, добавьте DISTINCT в UDF, чтобы обойти это.Или измените UDF JOIN на EXISTS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...