加入一个像声明SQL Server表(Join SQL Server tables on a lik

2019-07-28 19:47发布

我希望这不是一个重复。 我检查了搜索,我似乎无法找到一个明确的答案。

我有有它的主键设置为一个表UniqueIdentifier 。 我也有具有另一个表varchar ,基本上包含与包含我的第一个表的GUID的查询字符串的URL列。

所以,我的2个表是这样的:

StateTable

StateID                                  StateName
EB06F84C-15B9-4397-98AD-4A63DA2A238E     Active

URLTable

URL
page.aspx?id=EB06F84C-15B9-4397-98AD-4A63DA2A238E

我正在试图做的是联合起来URLTableStateTable ON的值StateID包含在URL表格中的URL。 我还没有真正想出的加入。 我甚至试过只选择了一个表,并试图通过在过滤的值StateTable 。 我试着做这样的事情:

SELECT  *
FROM URLTable
WHERE     EXISTS
    (SELECT  *
     FROM  StateTable
     WHERE URL LIKE '%' + StateID + '%')

即使不工作,因为它说我比较uniqueidentifiervarchar

有什么办法加入2个表使用类似命令,其中类似命令不是比较2个不兼容的变量?

谢谢!!

更新:让我补充我应该提到一些其他的东西。 查询是建立分析报告的目的。 该表是一个CMS分析软件包的一部分...所以更新或更改表结构不是一个选项。

其次,这些表看到交通非常高的量,因为他们正在拍摄现场的分析......这样的表现是非常多的问题。 第三件事是,在我的例子,我说的id =但可能有多个值,例如id=guid&user=guid&date=date

更新2:还有一件事我才意识到我的恐惧是,有时查询字符串已经从GUID删除划线..有时不是..所以,除非我“米错,我不能投子,以Uniqueidentifier可以。任何人证实? 叹息 。我没有得到它使用工作

REPLACE('-','',CONVERT(varchar(50), a.AutomationStateId))

但现在我非常符合这个性能问题担心,因为该URL的表非常大。 这可能是野兽的本质,不过,除非有什么我能做的。

Answer 1:

投STATEID到兼容的类型,例如:

WHERE URL LIKE '%' + CONVERT(varchar(50), StateID) + '%'

要么

WHERE URL LIKE N'%' + CONVERT(nvarchar(50), StateID) + N'%'

如果URL类型为nvarchar(...)

编辑

作为另一个答案指出,这可能导致大表上表现不佳。 该像一个CONVERT合并将导致表扫描。 这可能不是小表有问题,但你应该考虑拆分网址为两列,如果性能成为一个问题。 一列将包含“page.aspx?ID =”和其他的唯一标识符。 您的查询然后可以更容易地优化。



Answer 2:

你知道=是永远存在的,始终是一个UNIQUEIDENTIFIER 。 然后,你可以这样做:

WHERE CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID

编辑

作为注释的一部分,你也可以因此它通过JOIN 。 像这样:

select 
   u.* 
from 
   urltable
join statetable s 
   on CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID


Answer 3:

select u.* from urltable
join statetable s on url like N'%' + (convert(varchar(50),s.stateid) + N'%'

性能很可能是可怕的



Answer 4:

如果你建立一个临时表,第一,与选项索引临时表,你可能会得到一个性能改进。 然后,您可以同时修改了(你的临时表)的架构,其可以给你在你的加入选项。 通常加入到大表时,它有助于数据的子集,第一解压到一个临时表,然后再加入它。 临时表中的其他时间的开销比使用一个“丑陋的”大加盟



文章来源: Join SQL Server tables on a like statement