我有两张桌子

表格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

实际要求是我必须将两个表中的值连接起来并在视图中公开它。 然后,任何人都可以从视图中查询该列的标识。 因此,基本上必须进行串联。

#1楼 票数:2

这样尝试

SELECT *
FROM   table1
       JOIN table2
         ON table1.pid = table2.pid
            AND table2.KEY = 'ABC'
            AND table1.num = '123' 

#2楼 票数: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')

#3楼 票数:0

如果希望用户能够有效地查询级联值,则可以创建索引视图。 可以根据需要添加其他视图列。 请注意用于更新索引视图引用的表的SET选项要求( https://msdn.microsoft.com/zh-cn/library/ms191432.aspx )。 如果您使用的不是SQL Server Enterprise或Developer版本,则需要在查询中添加NOEXPAND提示,以使优化器考虑视图索引。

另外,我强烈建议您避免使用保留的关键字作为列名( keyidentity )。

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

#4楼 票数: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”即可。

  ask by Satyam Roy translate from so

未解决问题?本站智能推荐:

2回复

在SQL中删除查询的性能

我有一张有200,000条记录的表。 我想删除一些数据,如下所示: SelectedID用包含5000条记录的所需数据身份填充。 有两种方法: 1-我插入20,000个身份作为SelectedID,其中包含所需的5000条记录的身份。 2-我只插入那5000条记录的身份。 问
4回复

SQL查询中“NOTIN”的性能

我是SQL查询分析的新手。 最近我偶然发现了其中一个查询的性能问题,我想知道我的思维过程是否正确以及为什么Query Optimizer在这种情况下的工作方式。 我是SQL Server 2012.我有一个看起来像的SQL查询 在我的测试服务器上运行大约需要30秒。 在尝试理解花了这么
2回复

加入视图时的SQL性能问题

我有这个查询,它与视图上的查询一起加入后将永远运行。 加入之前,需要2分钟。 加入的查询本身需要1分钟。 他们在一起已经走了20多分钟。 我的问题是: 除了在视图上创建索引外,我可以做些什么来使此查询运行更快? 创建索引会使该查询在合理的时间内运行吗? 谢谢。 这是查
1回复

NHibernate和SQL查询性能问题:存储过程与本机SQL

我在NHibernate上执行SQL查询时遇到性能问题。 我试图在SQL查询中导入存储过程的SQL代码,发现性能大幅度下降。 这是一个测试示例... 在我的映射文件中,我有以下两个定义: sp_Test2本机代码与存储过程中的SQL代码完全相同。 现在,如果我运行这样的测试:
1回复

查询SQLServer上的视图时出现性能问题

我目前遇到了一些SQL Server 2016 Enterprise上出现奇怪行为的性能问题。 我在数据库中创建了一个新模式,然后在这个模式中创建了一个视图。 现在,当我直接连接到数据库时,它包含这个模式和视图,并编写一个简单的查询 完成需要大约30分钟(!)。 完全合格的查询也是
3回复

在多个SQL查询中测试性能

我正在努力提高 SQL-Server-2008 上某些 SQL 查询的效率。 执行每个查询有不同的方法,我想找到最快的方法。 但是,我遇到的问题是我无法确定哪个实际上执行得更快。 理想情况下,我可以一个接一个地运行每个查询,看看哪个运行得最快。 理想情况下... 问题是,SQL 对我来说太聪明了。
7回复

SQL性能问题(无where子句与where列(如“%”))

在查询中,执行where子句是否会降低性能? 与 建立一些动态查询,只是很好奇。 谢谢。
2回复

提高SQL查询性能

我有两张桌子。 在一个表格中,我们输入所有类型的模型,每个模型约有100行。 第二个表具有有关第一个项目的销售数据。 我需要产生这样的结果: 我的查询如下所示: 我可以通过上面的查询来实现,但是执行需要2分钟以上。 请提出如何改善效果的建议。 我听说过数据透视表和索引视图,但从