Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 条件交叉连接_Sql_Sql Server - Fatal编程技术网

Sql 条件交叉连接

Sql 条件交叉连接,sql,sql-server,Sql,Sql Server,下面有一个存储过程查询,它涉及返回部分分隔的搜索字符串。例如,通过搜索字符串“wis,k”进行搜索将返回ID为“wis”和“k”的所有结果。我正在为此使用函数和交叉联接,但如果附加交叉联接,则会阻止加载加载此存储过程时需要加载的所有数据。我在想,如果条件交叉连接是可能的,那么当我的搜索字符串变量'@ReceiptNo'为空时,我将省略交叉连接,并允许显示我的所有数据。请提出忠告。谢谢 我的存储过程的一部分: FROM [Transact] T LEFT JOIN [Outlet

下面有一个存储过程查询,它涉及返回部分分隔的搜索字符串。例如,通过搜索字符串“wis,k”进行搜索将返回ID为“wis”和“k”的所有结果。我正在为此使用函数和交叉联接,但如果附加交叉联接,则会阻止加载加载此存储过程时需要加载的所有数据。我在想,如果条件交叉连接是可能的,那么当我的搜索字符串变量'@ReceiptNo'为空时,我将省略交叉连接,并允许显示我的所有数据。请提出忠告。谢谢

我的存储过程的一部分:

    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

您需要处理NULL并将其设置为任何常量值。修改交叉连接以阅读以下注释查询:

CROSS JOIN (SELECT ISNULL(Portion, 1) AS Portion FROM DBO.SPLIT(@ReceiptNo , ',')) TTT
在上面的查询中,部分是DBO.SPLIT函数返回的列。将其名称更改为适当,并在需要时添加更多带ISNULL的列

我遗漏了什么,或者你可以简单地使用左连接而不是交叉连接?此外,您可以考虑将DBO.S拆除函数结果放入临时表中,然后将其索引到交叉/左连接中。
EDIT1:我找不到任何理由不应该将交叉连接更改为左连接,因为当@RecepitNo不为NULL时,它将处理更少的行。

您需要注意NULL并将其设置为任何常量值。修改交叉连接以阅读以下注释查询:

CROSS JOIN (SELECT ISNULL(Portion, 1) AS Portion FROM DBO.SPLIT(@ReceiptNo , ',')) TTT
在上面的查询中,部分是DBO.SPLIT函数返回的列。将其名称更改为适当,并在需要时添加更多带ISNULL的列

我遗漏了什么,或者你可以简单地使用左连接而不是交叉连接?此外,您可以考虑将DBO.S拆除函数结果放入临时表中,然后将其索引到交叉/左连接中。 EDIT1:我找不到任何理由不应该将交叉连接更改为左连接,因为当@RecepitNo不为NULL时,它将处理更少的行。

我只使用左连接。我只使用左连接。