13

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

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

所以我的两张桌子就像:

状态表

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

网址表

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

我要做的是连接在一起URLTable,并且StateTableON 的值StateID包含在 URL 表的 URL 中。我还没有真正弄清楚加入。我什至尝试只选择一张表并尝试按StateTable. 我试过做这样的事情:

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

即使这样也不起作用,因为它说我正在比较uniqueidentifierand varchar

有什么方法可以使用 like 命令连接 2 个表,并且 like 命令不比较 2 个不兼容的变量?

谢谢!!

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

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

更新 2:我刚刚意识到的另一件事让我感到恐惧的是,有时查询字符串会从 GUID 中删除破折号.. 有时没有.. 所以除非我弄错了,否则我不能将子字符串转换为Uniqueidentifier. 任何人都可以确认?叹息。我确实让它工作了

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

但现在我非常担心这方面的性能问题,因为 URL 的表非常大。不过,这可能是野兽的本性,除非我能做些什么。

4

4 回答 4

18

将 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。然后可以更轻松地优化您的查询。

于 2012-04-04T21:35:40.070 回答
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
于 2012-04-04T21:42:03.560 回答
4
select u.* from urltable
join statetable s on url like N'%' + (convert(varchar(50),s.stateid) + N'%'

性能可能很糟糕

于 2012-04-04T21:43:53.557 回答
0

如果您首先构建一个临时表,并且可以选择为临时表建立索引,您可能会获得性能提升。然后,您还可以修改(您的临时表的)架构,这可以为您提供加入选项。通常,在加入 BIG 表时,首先将数据子集提取到临时表,然后再加入它会有所帮助。其他时候临时表的开销比使用“丑陋”连接更大

于 2014-04-08T06:30:12.053 回答