在类似的语句上加入SQL Server表

时间:2012-04-04 21:31:44

标签: sql tsql select join

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

我有一张表,其主键设置为UniqueIdentifier。我还有一个具有varchar列的表,它基本上包含一个带有查询字符串的url,其中包含来自我的第一个表的guid。

所以我的2个表就像:

StateTable

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

URLTable

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

我要做的是联合URLTableStateTableStateID的值包含在URL表的URL中。我还没有真正想出加入。我甚至尝试过选择一个表格并尝试按StateTable中的值进行过滤。我尝试过这样的事情:

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

即使这样也行不通,因为它说我正在比较uniqueidentifiervarchar

有没有办法使用like命令连接2个表,而like命令没有比较2个不兼容的变量?

谢谢!!

更新:让我添加一些我应该提到的其他内容。该查询用于构建分析报告。这些表是CMS分析包的一部分......因此不能更新或更改表结构。

其次,这些表格看到的流量非常大,因为它们正在捕获网站分析...所以性能非常重要。第三件事就是在我的例子中,我说id =但是可能有多个值,例如id=guid&user=guid&date=date

更新2:我刚才意识到的另一件事是,有时候查询字符串会从GUID中删除破折号...有时候不会......所以除非我错了,否则我无法将子字符串转换为Uniqueidentifier。任何人都可以确认吗?叹息。我确实使用了

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

但是现在我非常担心这个性能问题,因为URL的表非常大。这可能是野兽的本质,除非我能做任何事情。

4 个答案:

答案 0 :(得分:17)

将StateID强制转换为兼容类型,例如

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

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

如果URL是nvarchar(...)

修改

正如另一个答案所指出的,这可能导致大型表的性能不佳。 LIKE与CONVERT结合将导致表扫描。对于小型表,这可能不是问题,但如果性能成为问题,您应该考虑将URL拆分为两列。一列包含'page.aspx?id =',另一列包含UNIQUEIDENTIFIER。然后可以更轻松地优化您的查询。

答案 1 :(得分:5)

您知道=始终存在且始终是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

答案 2 :(得分:4)

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

表现可能很糟糕

答案 3 :(得分:0)

如果首先构建临时表,可以获得性能改进,并可以选择索引临时表。然后,您还可以修改(临时表)的模式,该模式可以为您提供连接选项。通常在加入BIG表时,首先将一个数据子集提取到临时表,然后加入它。其他时候临时表的开销大于使用'丑'连接