如何在不同表的不同字段中搜索数字列表?

时间:2019-02-05 22:38:29

标签: sql-server sql-server-2008

我有一个数字列表,我已将它们加载到数据库的临时表中。我需要查找这些数字是否在两个不同的表中以及这些表的不同字段中。例如...

临时表

field1 值(1、2、3、4、5、6,... n)

表1 ID,n1,n2,n3,n4,n5,n6,n7,n8

表2 ID,n1,n2,n3,n4

ID中的Table1Table2相同。 field1#TemporaryTable上的值可以位于两个表中任何一个的任何字段中。

此外,临时表中的数字是平坦的,而在其他两个表的字段中,数字可以带有破折号-。我已经使用REPLACE (n1, '-', '')

解决了这个问题

我只想显示ID和数字。如果两者都不存在,我就不显示它。

希望你能帮助我。

1 个答案:

答案 0 :(得分:0)

您的最终动机是什么?如果您确实发现必须这样做,那么也许您想重新考虑您的设计。但是,只是为了好玩:

首先,让我们实际创建这些表:

create table #table1 ( 
    ID int identity(1,1), 
    n1 int, n2 int, n3 int, n4 int, 
    n5 int, n6 int, n7 int, n8 int
);

insert #table1 values 
    (1,2,3,4,5,6,7,8),
    (5,6,7,8,9,10,11,12),
    (9,10,11,12,13,14,15,16);

create table #table2 ( 
    ID int identity(1,1), 
    n1 int, n2 int, n3 int, n4 int
);

insert #table2 values 
    (1,2,3,4),
    (3,4,5,6),
    (7,8,9,10);

现在,通过不旋转将其垂直化,以便将所有值都放在一栏中:

declare @verticalized table (
    tbl int,
    id int,
    col char(2),
    val int
);

insert     @verticalized        
select     1 tbl, id, col, val
from       #table1
unpivot    (val for col in (n1,n2,n3,n4,n5,n6,n7,n8)) up

union all
select     2, id, col, val
from       #table2
unpivot    (val for col in (n1,n2,n3,n4)) up

然后进行一些汇总以回答您的问题。

select     val,
           tbls = count(distinct tbl), -- # of tables value is in
           cols = count(distinct col), -- # of columns value is in

           -- specific locations you can find the value
           locations = stuff((
               select   
               distinct ',T' + convert(char(1),tbl) + '.C' + col
               from     @verticalized sub
               where    sub.val = v.val
               for xml  path('')
           ),1,1,'')

from       @verticalized v
group by   val

尤其是您提到“ field1”中的存在。您可能可以从那里工作代码。