Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008 R2:行号()_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql server SQL Server 2008 R2:行号()

Sql server SQL Server 2008 R2:行号(),sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我有以下数据: 例如: 看起来像: select * from vdata; cola colb -------------- A B B C A X Z L N M O P R Z X Y T N F E G H 注意:现在我只想显示cola必须显示在colb中的数据,或者colb必须显示在cola中的数据,我想添加列以根据下一个记录中的值显示每个记录

我有以下数据:

例如:

看起来像:

select * from vdata;

cola   colb
--------------
A       B
B       C
A       X
Z       L
N       M
O       P  
R       Z
X       Y
T       N
F       E
G       H
注意:现在我只想显示cola必须显示在colb中的数据,或者colb必须显示在cola中的数据,我想添加列以根据下一个记录中的值显示每个记录的行号

预期结果:

对上述结果的解释:第一行在开始时有行号1,并再次分配给下两个记录,因为columncola或colb中的任何一个都有值A或B。由于第四条记录没有任何值A或B,所以将第2行指定给第四条记录,并且该过程将以相同的方式继续。注意,记录7有X和Y,它的行号是1,因为它与表中第二个记录A和X相关

我的错误尝试:


表中需要某种id来建立顺序

create table #vdata
(
id int identity(1,1),
cola varchar(10),
colb varchar(10)
 );

insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');


WITH Roots AS (
    SELECT 1 AS level
         ,id
         ,id AS topid
         ,cola
         ,colb
    FROM #vdata
  UNION ALL
    SELECT level + 1 AS level
          ,#vdata.id
          ,Roots.topid
          ,#vdata.cola
          ,#vdata.colb
    FROM Roots
         INNER JOIN #vdata
             ON (#vdata.id > Roots.id)
                AND (#vdata.cola = Roots.cola
                     OR #vdata.cola = Roots.colb
                     OR #vdata.colb = Roots.cola
                     OR #vdata.colb = Roots.colb)
)
, MaxLevel AS (
    SELECT id 
          ,topid
          ,DENSE_RANK() OVER (ORDER BY topid) AS RowNumbers
          ,cola
          ,colb
    FROM Roots
    WHERE level = (SELECT MAX(level) FROM Roots AS InnerRoots WHERE InnerRoots.id = Roots.id)
)
SELECT RowNumbers
      ,cola
      ,colb
FROM MaxLevel
ORDER BY RowNumbers

表中需要某种id来建立顺序

create table #vdata
(
id int identity(1,1),
cola varchar(10),
colb varchar(10)
 );

insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');


WITH Roots AS (
    SELECT 1 AS level
         ,id
         ,id AS topid
         ,cola
         ,colb
    FROM #vdata
  UNION ALL
    SELECT level + 1 AS level
          ,#vdata.id
          ,Roots.topid
          ,#vdata.cola
          ,#vdata.colb
    FROM Roots
         INNER JOIN #vdata
             ON (#vdata.id > Roots.id)
                AND (#vdata.cola = Roots.cola
                     OR #vdata.cola = Roots.colb
                     OR #vdata.colb = Roots.cola
                     OR #vdata.colb = Roots.colb)
)
, MaxLevel AS (
    SELECT id 
          ,topid
          ,DENSE_RANK() OVER (ORDER BY topid) AS RowNumbers
          ,cola
          ,colb
    FROM Roots
    WHERE level = (SELECT MAX(level) FROM Roots AS InnerRoots WHERE InnerRoots.id = Roots.id)
)
SELECT RowNumbers
      ,cola
      ,colb
FROM MaxLevel
ORDER BY RowNumbers
另一种方式

create table #vdata
(
cola varchar(10),
colb varchar(10)
 );

insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');



with src as
(
    select row_number() over(order by cola, colb) id, cola, colb
    from #vdata
)
, [matched] as
(
    select s1.*
    , (select min(s2.id) from src s2 where (s1.cola = s2.cola or s1.colb = s2.cola or s1.cola = s2.colb or s1.colb = s2.colb)) id2
    from src s1
)
, [result] as
(
    select m1.*
    , (select m2.id2 from [matched] m2 where m2.id = m1.id2) [id3]
    from [matched] m1
)
select cola, colb, dense_rank() over(order by id3) [rank]
from [result]
order by id
另一种方式

create table #vdata
(
cola varchar(10),
colb varchar(10)
 );

insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');



with src as
(
    select row_number() over(order by cola, colb) id, cola, colb
    from #vdata
)
, [matched] as
(
    select s1.*
    , (select min(s2.id) from src s2 where (s1.cola = s2.cola or s1.colb = s2.cola or s1.cola = s2.colb or s1.colb = s2.colb)) id2
    from src s1
)
, [result] as
(
    select m1.*
    , (select m2.id2 from [matched] m2 where m2.id = m1.id2) [id3]
    from [matched] m1
)
select cola, colb, dense_rank() over(order by id3) [rank]
from [result]
order by id

如果可乐必须在colb中出现,那么为什么预期中会出现“A”output@Pradeep,请再读一遍这封信。现在我明白了。如果可乐必须在可乐中出现,那么你怎么会在预期中得到“A”output@Pradeep,请把纸条再读一遍。现在我明白了。。
create table #vdata
(
cola varchar(10),
colb varchar(10)
 );

insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');



with src as
(
    select row_number() over(order by cola, colb) id, cola, colb
    from #vdata
)
, [matched] as
(
    select s1.*
    , (select min(s2.id) from src s2 where (s1.cola = s2.cola or s1.colb = s2.cola or s1.cola = s2.colb or s1.colb = s2.colb)) id2
    from src s1
)
, [result] as
(
    select m1.*
    , (select m2.id2 from [matched] m2 where m2.id = m1.id2) [id3]
    from [matched] m1
)
select cola, colb, dense_rank() over(order by id3) [rank]
from [result]
order by id