1

我有一个查询,我必须加入两个表。让我们说T1和T2。T1 有一个带有 Id 的列。每一行只有一个 Id 值。但是,第二张桌子是我苦苦挣扎的地方。在 T2 中有一列带有 Id,但一行可能有多个 Id。例如,T1.col1 有这个值:737382。但是 T2.col2 可以在一行中有这个条目:737382;239112;2838210;9923834;2388342;...

我知道这种结构违反了 1NF 之类的。但我无法更改数据或数据结构中的任何内容。现在我想做的是加入这两个表。请让我知道如果我错过了告诉任何相关信息以回答我的问题。来晚了,我的大脑已经筋疲力尽了~~

4

5 回答 5

0

尝试

    select tab2.*   -- whatever
      from t1 tab1
inner join t2 tab2 on ( ';'||tab2.col2||';' like '%;'||tab1.col1||';%' )
         ;

额外的附加;字符用于避免连接条件中的析取。

于 2013-07-18T14:43:09.363 回答
0

您是否尝试过类似的方法:

select 
    a.column1, 
    a.column2, 
    b.column1,
    b.column2 
from table a 
inner join table b on a.column1 = b.column1
于 2013-07-18T14:43:47.740 回答
0

您可以在联接中使用正则表达式,您的正则表达式可以检查您的T1.col1in T2.col2。正则表达式应该检查从字符串开头(T2.col2';'';'

于 2013-07-18T14:48:58.833 回答
0

由于一个 T2.Col2 可以保存n 个条目,因此您需要使用表值函数将它们解析为行,然后使用CROSS APPLY

请注意,如果 T2 很大,此解决方案将挂起很长时间

像这样的东西:

;WITH IDSplitted AS 
(
   SELECT * 
   FROM  T2
   CROSS APPLY dbo.[StringSplit](col2, ';')
)

SELECT * -- or whatever columns you need
FROM T1
INNER JOIN IDSplitted  ON IDSplitted.val = t1.col1

有StringSplit:

CREATE FUNCTION [dbo].[StringSplit]
(
  @delimited nvarchar(max),
  @delimiter nvarchar(100)     
) RETURNS @t TABLE
(
-- Id column can be commented out, not required for sql splitting string
  id int identity(1,1), -- I use this column for numbering splitted parts
  val nvarchar(max)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select 
    r.value('.','varchar(max)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
于 2013-07-18T15:11:55.960 回答
0

在使用 collapstar 的解决方案(这是正确的)后,我遇到了性能问题。所以我所做的是创建一个映射表,这样当我必须再次运行查询时,我不必等待那么久。所以我有一个预定的工作,它会在晚上进行连接并将输出写入映射表

于 2013-08-13T13:03:52.407 回答