我有两张桌子
表1:
-------------------------------
id | pid | name | place | num |
-------------------------------
表2:
------------------
pid | name | key |
------------------
现在我正在编写一个查询,它是两列的串联,一列来自table1,另一列来自table2。
select *
from table1 join table2
on table1.pid = table2.pid
and table2.key + '-' + table1.num = 'ABC-123'
由于此连接是在两个表上完成的,这两个表再次必须扫描结果的大多数行,因此结果提取非常慢并且不是即时的,这是预期的。
在这种情况下,什么是可取的。任何人都可以帮助我。
最初它被认为是创建一个基于函数的索引,以便有一些性能提升,但我不确定这是否会有所帮助。此外,我无法在不同表的两列上创建基于函数的索引。
新增加:
给出的答案是合法的,但我觉得它远离我的实际要求。如果我有这样的要求
select table2.key + '-' + table1.num identity
from table1 join table2
on table1.pid = table2.pid
实际要求是我必须连接两个表中的值并在视图中公开它。然后任何人都可以从视图中查询该列标识。所以基本上连接是必须的。
答案 0 :(得分:2)
试试这个,
SELECT *
FROM table1
JOIN table2
ON table1.pid = table2.pid
AND table2.KEY = 'ABC'
AND table1.num = '123'
答案 1 :(得分:0)
而不是使用一个字符串'ABC-123'尝试将其拆分为'ABC'& '123'-
SELECT *
FROM table1
JOIN table2
ON table1.pid = table2.pid
AND
table2.key IN ('ABC')
AND
table1.num IN ('123')
答案 2 :(得分:0)
如果希望用户能够有效地查询连接值,则可以创建索引视图。可以根据需要添加其他视图列。请注意更新索引视图(https://msdn.microsoft.com/en-us/library/ms191432.aspx)引用的表的SET
选项要求。如果您不使用SQL Server Enterprise或Developer Edition,则需要向查询添加NOEXPAND
提示,以便优化程序考虑视图索引。
此外,我强烈建议您避免将保留关键字用作列名(key
和identity
);
CREATE VIEW dbo.IndexedView
WITH SCHEMABINDING
AS
SELECT table2.[key] + '-' + table1.num [identity]
FROM dbo.table1
JOIN dbo.table2
ON table1.pid = table2.pid;
GO
CREATE UNIQUE CLUSTERED INDEX cdx_IndexedView ON IndexedView([identity]);
GO
答案 3 :(得分:0)
如果您一次只搜索一个值,则可以以编程方式分割值。这与其他答案类似,但会为您分配。
CREATE PROCEDURE usp_Get_Concat_ID
@ConcatID AS varchar(20)
AS
BEGIN
declare @Table1Num as varchar(20) = SUBSTRING(@ConcatID, 0, CHARINDEX('-', @ConcatID))
declare @Table2Key as varchar(20) = SUBSTRING(@ConcatID, CHARINDEX('-', @ConcatID)+1, LEN(@ConcatID))
select *
from table1 join table2
on table1.pid = table2.pid
and table1.num = @Table1Num
and table2.key = @Table2Key
END
GO
然后,你可以调用usp_Get_Concat_ID'ABC-123'。