是否可以加入动态?取决于列的内容?
Is it possible to join dynamic ? Depending on the content of a column?
我正在使用此联接从 tblChassis
检索行,其中 temp.ChassisNumber
匹配 ch.ChassisNumber
虽然这有效,但速度很慢。
速度慢的原因是 like '%'
select ...
from @TempTable temp
left join tblChassis ch on ch.ChassisNumber like '%' + temp.ChassisNumber + '%'
我必须使用 like
,因为有时我无法获得完整的搜索值。
这是如何工作的,用户将 chassis numbers
的列表放在表单上,然后该表单会在 table 中查找底盘编号。有时会有完整的底盘编号(长度 = 17),但有时他们没有,只有一部分。这部分可以是最后xx位,也可以是前xx位,也可以是中间的一些数字。
当然,有时他们会混合使用。
所以我做的是制作一个临时文件 table declare @TempTable (ChassisNumber varchar(17))
并用用户在表格中输入的所有底盘编号填充它。
然后我可以从这个 table select 加入我需要的所有其他 table。
declare @TempTable table(ChassisNumber varchar(17))
insert into @TempTable
values ('WF0EXXTTREMG4210'),
('WF0JXXWPCHMB28874'),
('WF0JXXWPCHMB'),
('MB28874')
select ...
from @TempTable temp
left join tblChassis ch on ch.ChassisNumber like '%' + temp.ChassisNumber + '%'
所以现在我试图让查询执行得更快一些,我想知道是否有办法使连接动态化,这样我就可以在底盘号不是 17 时使用 like
数字,当底盘号有 17 位时使用 =
。
当连接为 ch.ChassisNumber = temp.ChassisNumber
时,查询速度如此之快,我什至无法衡量它。
这样的事情可能吗?
例如这个伪代码(不是正常工作而是给出我正在寻找的想法)
on case
when len(temp.ChassisNumber) = 17
then ch.ChassisNumber = temp.ChassisNumber
else ch.ChassisNumber like '%' + temp.ChassisNumber + '%'
end
编辑
我想我可以先加入 temptable 中底盘编号为 17 位的所有行,然后 union
查询所有其他行。
这会有所帮助,但我希望有更好的东西。
我认为 Stu says in there 有一些优点,但是,我想补充一点。虽然这是一个 table 变量,但我建议在 table 中添加一个计算列,然后你可以像下面这样进行过滤。这意味着 如果 table 中的所有行的长度为 17
那么底部查询应该被“掩盖”为 WHERE
将过滤掉变量中的所有行:
DECLARE @TableVariable table (ChassisNumber varchar(17),
ChassisNumberLen AS LEN(ChassisNumber) PERSISTED);
INSERT INTO @TableVariable (ChassisNumber)
VALUES ('WF0EXXTTREMG4210'),
('WF0JXXWPCHMB28874'),
('WF0JXXWPCHMB'),
('MB28874');
SELECT *
FROM @TableVariable;
SELECT {YourColumns}
FROM @TableVariable TV
LEFT JOIN dbo.tblChassis CH ON TV.ChassisNumber = CH.ChassisNumber
WHERE TV.ChassisNumberLen = 17
UNION ALL
SELECT {YourColumns}
FROM @TableVariable TV
LEFT JOIN dbo.tblChassis CH ON CH.ChassisNumber LIKE '%' + TV.ChassisNumber + '%'
WHERE TV.ChassisNumberLen < 17; --I assume they can't be longer than 17
我正在使用此联接从 tblChassis
检索行,其中 temp.ChassisNumber
匹配 ch.ChassisNumber
虽然这有效,但速度很慢。
速度慢的原因是 like '%'
select ...
from @TempTable temp
left join tblChassis ch on ch.ChassisNumber like '%' + temp.ChassisNumber + '%'
我必须使用 like
,因为有时我无法获得完整的搜索值。
这是如何工作的,用户将 chassis numbers
的列表放在表单上,然后该表单会在 table 中查找底盘编号。有时会有完整的底盘编号(长度 = 17),但有时他们没有,只有一部分。这部分可以是最后xx位,也可以是前xx位,也可以是中间的一些数字。
当然,有时他们会混合使用。
所以我做的是制作一个临时文件 table declare @TempTable (ChassisNumber varchar(17))
并用用户在表格中输入的所有底盘编号填充它。
然后我可以从这个 table select 加入我需要的所有其他 table。
declare @TempTable table(ChassisNumber varchar(17))
insert into @TempTable
values ('WF0EXXTTREMG4210'),
('WF0JXXWPCHMB28874'),
('WF0JXXWPCHMB'),
('MB28874')
select ...
from @TempTable temp
left join tblChassis ch on ch.ChassisNumber like '%' + temp.ChassisNumber + '%'
所以现在我试图让查询执行得更快一些,我想知道是否有办法使连接动态化,这样我就可以在底盘号不是 17 时使用 like
数字,当底盘号有 17 位时使用 =
。
当连接为 ch.ChassisNumber = temp.ChassisNumber
时,查询速度如此之快,我什至无法衡量它。
这样的事情可能吗?
例如这个伪代码(不是正常工作而是给出我正在寻找的想法)
on case
when len(temp.ChassisNumber) = 17
then ch.ChassisNumber = temp.ChassisNumber
else ch.ChassisNumber like '%' + temp.ChassisNumber + '%'
end
编辑
我想我可以先加入 temptable 中底盘编号为 17 位的所有行,然后 union
查询所有其他行。
这会有所帮助,但我希望有更好的东西。
我认为 Stu says in there 17
那么底部查询应该被“掩盖”为 WHERE
将过滤掉变量中的所有行:
DECLARE @TableVariable table (ChassisNumber varchar(17),
ChassisNumberLen AS LEN(ChassisNumber) PERSISTED);
INSERT INTO @TableVariable (ChassisNumber)
VALUES ('WF0EXXTTREMG4210'),
('WF0JXXWPCHMB28874'),
('WF0JXXWPCHMB'),
('MB28874');
SELECT *
FROM @TableVariable;
SELECT {YourColumns}
FROM @TableVariable TV
LEFT JOIN dbo.tblChassis CH ON TV.ChassisNumber = CH.ChassisNumber
WHERE TV.ChassisNumberLen = 17
UNION ALL
SELECT {YourColumns}
FROM @TableVariable TV
LEFT JOIN dbo.tblChassis CH ON CH.ChassisNumber LIKE '%' + TV.ChassisNumber + '%'
WHERE TV.ChassisNumberLen < 17; --I assume they can't be longer than 17