如何在查询中检查子查询的交集?

时间:2011-05-15 14:55:47

标签: sql sql-server-2005 tsql

我有下一个查询:

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 个答案:

答案 0 :(得分:1)

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

但是,如果@parameter具有重复值,则JOIN和INTERSECT会给出不同的结果。例如,将DISTINCT添加到UDF以解决此问题。或者将udf JOIN更改为EXISTS