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