我正在运行SQL Server2008,并试图对一些存储不佳的数据运行一些查询,我不想遍历这些数据并试图清理它们(需要处理数百万行)。我有一个日志表,其中一个表中包含一些以逗号分隔的字符串形式的FK数据,另一个表中包含一个整数PK。我希望能够将整数的FK列表连接到主表中适当的PK整数。我的查询是这样的:
SELECT
L.*
FROM MyLogs L (NOLOCK)
INNER JOIN Details D (NOLOCK) ON L.SearchValue = D.ID在上面的查询中,L.SearchValue包含"123,456,7890",而D.ID是一个整数主键。有没有办法以任何一种有效的方式将这些连接在一起,或者我应该接受我的命运,并开始编写一个脚本,将所有这些逗号分隔的值分解到单独的行中?
发布于 2009-12-09 00:29:44
您需要其中之一(修改为强制转换为int)
T-SQL: Opposite to string concatenation - how to split string into multiple records
然后,你就可以
SELECT
L.*
FROM MyLogs L (NOLOCK),
Details D (NOLOCK)
Where D.ID In fn_WhatEverYouCallYourSplitFunction(L.SearchValue, ',')不,这不是很有效率。完全没有。
发布于 2009-12-09 00:25:24
非常非常糟糕的设计,这将是非常糟糕的性能,但你可以使用CharIndex函数
Select L.*FROM MyLogs L (NOLOCK)
Join Details D (NOLOCK)
On CharIndex(Cast(D.ID as varChar(6)), L.SearchValue) > 0这将产生一些错误的连接,因为12将在'34,312,455‘中。要消除这些连接,您必须通过包括分隔符来使查询更加复杂
Select L.*FROM MyLogs L (NOLOCK)
Join Details D (NOLOCK)
On CharIndex(Cast(', ' + D.ID as varChar(6)) + ',',
', ' + L.SearchValue + ',') > 0..。但我建议您开始编写一个脚本,将所有这些逗号分隔的值分成单独的行。
发布于 2009-12-09 00:26:51
最终,破坏这些存储糟糕的数据的脚本将比编写一个尝试连接这些值的粗糙SQL查询的效率高得多。我不确定加入是不是可行的方法。也许某种形式的子查询更适合作为计划A。
https://stackoverflow.com/questions/1868037
复制相似问题