交叉加入条件

时间:2011-11-29 02:05:59

标签: sql sql-server

我在下面有一个Stored Proc查询,它涉及返回部分分隔的搜索字符串。例如,通过搜索字符串'wis,k'的搜索将返回所有具有'wis'和'k'的ID的结果。我正在使用函数和交叉连接但是如果附加交叉连接的问题将阻止加载我加载此SPROC时需要的所有数据。我在想是否有条件交叉连接是可能的,这样当我的搜索字符串变量'@ReceiptNo'为空时,我将省略交叉连接并允许显示我的所有数据。请善意的建议。感谢。

我的SPROC部分:

    FROM [Transact] T 
    LEFT JOIN [Outlet] O On (T.Outlet_Code = O.Code)
    LEFT JOIN [SystemCode] SC on (CONVERT(NVARCHAR,T.Mode) = SC.Code)
    CROSS JOIN DBO.SPLIT(@ReceiptNo , ',') --SPLIT function to seperate delimited string
    Where
    (
       CardNo In
       (
          Select [CardNo]
          FROM [Card]
          WHERE [CardNo] = @CardNo
             AND [DeletedBy] IS NULL
             AND [DeletedOn] IS NULL
             AND [MemberID] = @MemberId
       )
    )
       and
       (
          (T.TransactDate Between @TransactDateFrom And @TransactDateTo
             or @TransactDateFrom is null
             or @TransactDateTo is null
          )
          and (T.TransactDate >= @TransactDateFrom
             or @TransactDateFrom is null)
          and (T.TransactDate <= @TransactDateTo
             or @TransactDateTo is null)             
          and
          (
             (',' + @Mode +',' LIKE '%,' + CONVERT(VARCHAR, T.Mode) + ',%')
             or @Mode is null
          )
         and    (T.ReceiptNo LIKE '%' + VAL + '%')  --This is the 'LIKE' condition to return desired search string results
          or (@TransactDateFrom is null
             and @TransactDateTo is null 
             and @Mode is null 
             and @Outlet_Code is null
             and @ReceiptNo is null
             )
       )
    Group by T.AutoID, TransactDate,TransactTime, SC.Name, O.Name
       , ReceiptNo, AmountSpent, TransactPoints, VoidOn

1 个答案:

答案 0 :(得分:1)

您需要处理NULL并将其设置为任何常量值。将CROSS JOIN修改为(阅读以下查询中的注释):

CROSS JOIN (SELECT ISNULL(Portion, 1) AS Portion FROM DBO.SPLIT(@ReceiptNo , ',')) TTT

在上面的查询中,PortionDBO.SPLIT函数返回的列。如果需要,将其名称更改为适当的名称并添加更多列(使用ISNULL)。

我错过了什么或者你可以简单地使用LEFT JOIN而不是CROSS JOIN?另外,您可以考虑将DBO.SPLIT函数结果放入临时表中,对其进行索引,然后在CROSS / LEFT JOIN中使用它。

编辑#1:我找不到任何理由你不应该将CROSS JOIN改为LEFT JOIN,因为当@RecepitNo不为NULL时它会处理更少的行。