2013-05-21 29 views
0

我有這個表:由於考慮到Type 1第一記錄必須以匹配對了單排兩排

A B   C 
1 Record 1 Type 1 
2 Record 2 Type 2 
3 Record 3 Type 1 
4 Record 4 Type 2 

我需要他們的價值觀在C來配對行(類型1 &類型2)最近IDType 2

所需的輸出:

A B   C  A B   C 
1 Record 1 Type 1 2 Record 2 Type 2 
3 Record 3 Type 1 4 Record 4 Type 2 

我試着做次在與2個CTE的查詢,但我不能想出了預期的結果:

WITH SET_A (A, B, C) AS 

    (SELECT * FROM A WHERE C = 'Type 1'), 

SET_B (A, B, C) AS 
    (SELECT * FROM A WHERE C = 'Type 2') 

SELECT * FROM SET_A CROSS JOIN SET_B; 

是否有任何其他的方法比使用交叉連接?

+0

目前尚不清楚你想在這個例子中加入什麼。 – Randy

+0

@Randy我想配對行,這樣在一行中將會出現'Type 1'和'Type 2'記錄 –

+1

它是否總是2個相鄰行?你能加入這個平臺嗎? – Malk

回答

1

在這裏你去。對於每個「類型1」,它將找到最近的後續(按ID)「類型2」。

http://sqlfiddle.com/#!6/a5263/20

CREATE TABLE t 
(
    A int, 
    B varchar(32), 
    C varchar(32) 
); 



insert into t values (1, 'Record 1', 'Type 1') 
insert into t values (2, 'Record 2', 'Type 2') 
insert into t values (3, 'Record 3', 'Type 1') 
insert into t values (4, 'Record 4', 'Type 2') 
insert into t values (5, 'Record 5', 'Type 1') 
insert into t values (6, 'Record 6', 'Type 1a') 
insert into t values (7, 'Record 7', 'Type 2') 


; 

with set_a as 
(
    select * from t where c = 'type 1' 
) 
, set_b as 
(
    select a, b, c, a_match = (select max(t2.a) from t t2 where t2.a < t.a and t2.c = 'type 1') 
    from t where c = 'type 2' 
) 
select set_a.* , a2 = set_b.a, b2 = set_b.b, c2 = set_b.c 
from set_a 
join set_b on set_b.a_match = set_a.a 
-1

試試這個

SELECT * FROM yourtable t1, yourtable t2 WHERE t1.c=t2.c 
+0

OP指定他需要行對,所以「*將會有'類型1' 2型記錄*「。 –

+3

另外,使用'SELECT *'和'SELF JOIN'是非常非常糟糕的主意。 –

1
SELECT t1.a a1, t1.b b1, t1.c c1, t2.a a2, t2.b b2, t2.c c2 
FROM Table1 t1 
JOIN Table1 t2 ON t1.c = 'Type 1' AND t2.c = 'Type 2' AND t1.a < t2.a 
WHERE t2.a = (SELECT MIN(t3.a) FROM Table1 t3 WHERE t3.c = 'Type 2' AND t3.a > t1.a) 

SQL Fiddle

+0

感謝您的答案,儘管您的答案產生了所需的查詢,@Malk的答案更適合我的情況。我忘了提及類型2身份證不能重複,因爲他們只能在一對。 請看這裏http://sqlfiddle.com/#!3/0f0ff/3/0 再次感謝 –

+1

這個樣本怎麼樣:http://sqlfiddle.com/#!3/4010e/1呢? –

+0

謝謝我沒有看到 –