2017-02-01 83 views
1

在SQL Server中,我有兩個表。第一個是如下:如何在SQL Server中交叉連接兩個表,只重複一些值

id Value 
1 Green 
2 Yellow 
3 Red 

第二個是

id Value 
1 John 
2 Paul 
3 George 
4 Ringo 
5 Mick 
6 Keith 
7 Ronnie 

我如何加入這兩個表,如結果數據集它如下:

id1 Value1 id2 Value2 
1 Green 1 John 
2 Yellow 2 Paul 
3 Red 3 George 
1 Green 4 Ringo 
2 Yellow 5 Mick 
3 Red 6 Keith 
1 Green 7 Ronnie 
+0

我改變在每個實施例表中的行的數目爲奇數的行 – thx0125

回答

0

試試這個:

Select * 
From (Select 
    t.*, 
    2 - (Row_number() over (order by id) % 2) idx 
From second_table t) t inner join first_table t2 on t2.id = t.idx; 
0

您需要在where子句 中的一項聲明表示table1.id%2 = table2.id%2

模運算符%將匹配第二個表的奇數值到綠色和偶數值到黃色。

+0

Thak你,偉大的答案;如果我在第一張桌子上有3排,第二張桌子上有7張? – thx0125

+0

@ thx0125:如果第一行中有3行,第二行中有7行,則使用%3而不是%2。第二個表中的前6行將與預期的第一個表匹配。第二個表中的第七行將與第一個表的第一行相匹配,這樣就會有三次出現第一個表 - 第一行,而第一個表的第二和第三行只有兩次出現。 –

0

下面是應該更新的版本問題的工作,一個樣本:

declare @colors table (
    id int not null, 
    value nvarchar(15) not null 
) 
declare @people table (
    id int not null, 
    name nvarchar(15) not null 
) 

insert into @colors (id, value) values (1, 'Green'),(2,'Yellow'),(3,'Red') 
insert into @people (id, name) values (1, 'John'),(2,'Paul'),(3,'George'),(4,'Ringo'),(5,'Mick'),(6,'Keith'),(7,'Ronnie') 

---- 

select csub.id, csub.value, psub.id, psub.name 
from 
    (
     select id, name, 
      (row_number() over (order by id)) % (select count(*) from @colors) as rnum 
     from @people 
    ) as psub 
    join (
     select id, value, 
      ((row_number() over (order by id)) % (select count(*) from @colors)) as rnum 
     from @colors 
    ) csub on psub.rnum = csub.rnum 
order by psub.id 

注:這也適用,即使實際ID值在兩個表有差距。像:

insert into @colors (id, value) values (1, 'Green'),(17,'Yellow'),(33,'Red'),(47,'Black) 
insert into @people (id, name) values (1, 'John'),(2,'Paul'),(3,'George'),(7,'Ringo'),(15,'Mick'),(16,'Keith'),(37,'Ronnie') 

和它的作品,無論你有多少行有顏色表。輸出使用上述樣品,在ID的間隙的範圍內:

+----+--------+----+--------+ 
| id | value | id | name | 
+----+--------+----+--------+ 
| 1 | Green | 1 | John | 
| 17 | Yellow | 2 | Paul | 
| 33 | Red | 3 | George | 
| 47 | Black | 7 | Ringo | 
| 1 | Green | 15 | Mick | 
| 17 | Yellow | 16 | Keith | 
| 33 | Red | 37 | Ronnie | 
+----+--------+----+--------+