仅当为参数指定的某些值(条件相交)时,SQL才会相交

时间:2016-06-13 15:32:00

标签: sql sql-server

我根据给出的三个参数查询交叉三个查询。

所以我使用简单的交叉完成它就像这样

Select name, email from table1 where param='p1'
intersect
Select name, email from table1 where param='p2'
intersect
Select name, email from table1 where param='p3'

但问题是有时很少有参数没有数据或空白。在这种情况下,由于与空白数据相交,查询结果无效。那么我怎么能处理这种情况,所以如果没有一个参数的数据(在3个中的任何一个中),那个查询就不应该被考虑在整个

2 个答案:

答案 0 :(得分:2)

为什么在同一列上使用INTERSECT三次? INTERSECT基本上是INNER JOIN。如前所述,INNER JOINS根据VENN图仅返回在每个连续查询中找到的结果集(意味着{A} U {B}与{A} U {C}不同)

实际上,您的问题并未回答参数是否为@variable,在这种情况下,出于索引原因,您应该使用将参数传递给变量,然后再将其传递给查询。 否则,查询将不会使用SARG

相反,请使用以下内容:

DECLARE @Param  [DATA_TYPE]{#}
      , @Param2 [DATA_TYPE]{#}
      , @Param3 [DATA_TYPE]{#}

SET @Param = [USP_Proc @param = 'p1']
  , @Param2 = [USP_Proc @param = 'p2']
  , @Param3 = [USP_Proc @param = 'p3']

SELECT  NAME
      , EMAIL
 FROM table1
 WHERE col_1 = @param
    OR col_1 = @param2
    OR col_1 = @param3

答案 1 :(得分:0)

如果查询A中的值也存在于查询B中且它们也存在于查询C中,则仅返回值

因此,在第一个示例中,值'A'存在于所有三个查询中,因此它将返回'A'。在第二个示例中,当您与三个查询相交时,并且在所有三个查询中都不存在“A”,因此它不返回任何值。您可能希望使用“Union”而不是“Intersect”,因为它会在查询A或B或C中存在值时返回数据,如第三个示例所示,它将返回“A”和“B”的值。

Example 1:

SELECT 'A'
intersect
SELECT 'A'
intersect
SELECT 'A'

Example 2:

SELECT 'A'
intersect
SELECT 'A'
intersect
SELECT 'B'

Example 3:

SELECT 'A'
UNION
SELECT 'A'
UNION
SELECT 'B'