![](/img/trans.png)
[英]Indexing on Inner Join with Table Valued Function and OR statement
[英]Why wouldn't we use INNER JOIN on a Table Valued Function?
在线搜索后,我找不到任何建议可以或应该将INNER JOIN与表值函数一起使用的方法,我很好奇,为什么? 例如,SSRS报表开发人员使用非常常见的TVF作为报表中的多值参数,因此他们可以将结果解析为表格。
CREATE FUNCTION [dbo].[ParmSplit] (
@List nvarchar(MAX),
@SplitOn nchar(1) )
RETURNS @RtnValue TABLE (
SplitValue nvarchar(250) )
AS
BEGIN
WHILE (CHARINDEX(@SplitOn,@List) > 0)
BEGIN
INSERT INTO @RtnValue (SplitValue)
SELECT SplitValue = LTRIM(RTRIM(SUBSTRING(@List,1,CHARINDEX(@SplitOn,@List) - 1)))
SET @List = SUBSTRING(@List,CHARINDEX(@SplitOn,@List) + LEN(@SplitOn), LEN(@List))
END
INSERT INTO @RtnValue (SplitValue)
SELECT SplitValue = LTRIM(RTRIM(@List))
RETURN
END
好的,假设我们有一个状态表,并且在我们的报告中有一个状态多值参数。 我们希望将参数中传递的状态与表中的状态进行匹配。 这是状态表的定义:
CREATE TABLE #StateTable (
StatID int IDENTITY (1,1)
,StateCode char(2) );
插入一些记录:
INSERT INTO #StateTable
SELECT 'AL';
INSERT INTO #StateTable
SELECT 'AK';
INSERT INTO #StateTable
SELECT 'AZ';
INSERT INTO #StateTable
SELECT 'AR';
INSERT INTO #StateTable
SELECT 'CA';
INSERT INTO #StateTable
SELECT 'CO';
INSERT INTO #StateTable
SELECT 'CT';
INSERT INTO #StateTable
SELECT 'DE';
INSERT INTO #StateTable
SELECT 'DC';
INSERT INTO #StateTable
SELECT 'FL';
INSERT INTO #StateTable
SELECT 'GA';
INSERT INTO #StateTable
SELECT 'GU';
INSERT INTO #StateTable
SELECT 'HI';
INSERT INTO #StateTable
SELECT 'ID';
INSERT INTO #StateTable
SELECT 'IL';
INSERT INTO #StateTable
SELECT 'IN';
INSERT INTO #StateTable
SELECT 'IA';
INSERT INTO #StateTable
SELECT 'KS';
INSERT INTO #StateTable
SELECT 'KY';
INSERT INTO #StateTable
SELECT 'LA';
INSERT INTO #StateTable
SELECT 'ME';
INSERT INTO #StateTable
SELECT 'MD';
现在使用TVF和INNER JOIN查询
DECLARE @MultiValuedParameter varchar(500) = 'IA, KS, KY, LA, ME, MD, IN, IL'
SELECT
StateCode
FROM #StateTable s
INNER JOIN dbo.ParmSplit(@MultiValuedParameter, ',') p ON s.StateCode = p.SplitValue
使用CROSS APPLY进行相同的查询。
DECLARE @MultiValuedParameter varchar(500) = 'IA, KS, KY, LA, ME, MD, IN, IL'
SELECT
StateCode
FROM #StateTable
CROSS APPLY dbo.ParmSplit(@MultiValuedParameter, ',')
WHERE SplitValue = StateCode
CROSS APPLY需要一个WHERE子句,该子句可以有效地创建一个INNER JOIN。
我一直对此感到好奇。 即使此示例仅返回单列,您仍可以将其应用于多列表结果。 为什么当我们谈论TVF时,我们只应使用CROSS APPLY?
实际上,您不会/不应该这样做。 您正在应用具有静态值的TVF。 当参数将根据数据集动态变化时,应使用APPLY(交叉或外部)。
谁说您需要/应该将TVLY与APPLY一起使用? 您使用JOIN展示了它,我还可以看到该值正在将它用作子查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.