我希望这不是重复。我检查了搜索结果,似乎无法找到明确的答案。
我有一张表,其主键设置为UniqueIdentifier
。我还有一个具有varchar
列的表,它基本上包含一个带有查询字符串的url,其中包含来自我的第一个表的guid。
所以我的2个表就像:
StateTable
StateID StateName
EB06F84C-15B9-4397-98AD-4A63DA2A238E Active
URLTable
URL
page.aspx?id=EB06F84C-15B9-4397-98AD-4A63DA2A238E
我要做的是联合URLTable
和StateTable
,StateID
的值包含在URL表的URL中。我还没有真正想出加入。我甚至尝试过选择一个表格并尝试按StateTable
中的值进行过滤。我尝试过这样的事情:
SELECT *
FROM URLTable
WHERE EXISTS
(SELECT *
FROM StateTable
WHERE URL LIKE '%' + StateID + '%')
即使这样也行不通,因为它说我正在比较uniqueidentifier
和varchar
。
有没有办法使用like命令连接2个表,而like命令没有比较2个不兼容的变量?
谢谢!!
更新:让我添加一些我应该提到的其他内容。该查询用于构建分析报告。这些表是CMS分析包的一部分......因此不能更新或更改表结构。
其次,这些表格看到的流量非常大,因为它们正在捕获网站分析...所以性能非常重要。第三件事就是在我的例子中,我说id =但是可能有多个值,例如id=guid&user=guid&date=date
。
更新2:我刚才意识到的另一件事是,有时候查询字符串会从GUID中删除破折号...有时候不会......所以除非我错了,否则我无法将子字符串转换为Uniqueidentifier
。任何人都可以确认吗?叹息。我确实使用了
REPLACE('-','',CONVERT(varchar(50), a.AutomationStateId))
但是现在我非常担心这个性能问题,因为URL的表非常大。这可能是野兽的本质,除非我能做任何事情。
答案 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表时,首先将一个数据子集提取到临时表,然后加入它。其他时候临时表的开销大于使用'丑'连接