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

div*_*rix 12 sql t-sql select join

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

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

所以我的2个表就像:

StateTable

StateID                                  StateName
EB06F84C-15B9-4397-98AD-4A63DA2A238E     Active
Run Code Online (Sandbox Code Playgroud)

URLTable

URL
page.aspx?id=EB06F84C-15B9-4397-98AD-4A63DA2A238E
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的是连接在一起,URLTable并且StateTableStateID包含在URL表的URL中.我还没有真正想出加入.我甚至尝试过只选择一个表并尝试按值中的值进行过滤StateTable.我尝试过这样的事情:

SELECT  *
FROM URLTable
WHERE     EXISTS
    (SELECT  *
     FROM  StateTable
     WHERE URL LIKE '%' + StateID + '%')
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!!

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

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

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

REPLACE('-','',CONVERT(varchar(50), a.AutomationStateId))
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*hil 17

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

WHERE URL LIKE '%' + CONVERT(varchar(50), StateID) + '%'
Run Code Online (Sandbox Code Playgroud)

要么

WHERE URL LIKE N'%' + CONVERT(nvarchar(50), StateID) + N'%'
Run Code Online (Sandbox Code Playgroud)

如果URL是nvarchar(...)

编辑

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


Ari*_*ion 5

你知道吗=会永远存在并永远是一个UNIQUEIDENTIFIER.然后你可以这样做:

WHERE CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID
Run Code Online (Sandbox Code Playgroud)

编辑

作为评论的一部分,你也可以这样做JOIN.像这样:

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


Ton*_*son 5

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

性能可能会很糟糕