2015-06-09 54 views
0

我有一個包含indicies列表的表和值SQL排序而交錯

OrigTable

Index  Value 
    1  10 
    2  11 
    3  16 
    4  18 
    5  14 
    6  11 
    7  10 
    8  12 
    9  20 
10  17 

我需要使用其他兩個表來分隔值。

Table1將包含行從OrigTable其中Value是< = 15,和

Table2將包含> 15,而且還含有在兩個方向上的一個點,從而如果索引Ñ對應於上述值15,它將被包括在表2中,但這樣會indicies n-1個n + 1個

作爲這樣的結果將

Table1

Index Value 
    1  10 
    2  11 
    5  14 
    6  11 
    7  10 
    8  12 

Table2

Index Value 
    2  11 
    3  16 
    4  18 
    5  14 
    8  12 
    9  20 
10  17 

我一直沒能確定的方式來做到這一點使用SQL。這是不可能的,還是我錯過了一些可以使這個可行的命令?

編輯:15將包括在表1中;我忘了添加'或等於'。通過「在任一方向上的一個點」,我的意思是,如果索引Ñ對應於上述值15,它將被包括在表2中,但這樣會indicies n-1個n + 1個

+1

爲什麼索引2在兩個表中? 「你的意思是」在任何一個方向上都包含一個點「 – PaulFrancis

+1

窮人怎麼樣15,如果她現在在哪裏,她會去哪裏 – Drew

+3

你正在使用哪個DBMS? sql server <> mysql –

回答

1
create table OrigTable 
( 
theIndex int not null, 
theValue int not null 
); 

insert into OrigTable (theIndex,theValue) values (1,10),(2,11),(3,16),(4,18),(5,14),(6,11),(7,10),(8,12),(9,20),(10,17); 
-- select * from OrigTable; 

create table table1 
( 
theIndex int not null, 
theValue int not null 
); 

create table table2 
( 
theIndex int not null, 
theValue int not null 
); 

insert into table1 (theIndex,theValue) select theIndex,theValue from OrigTable where theValue<=15; 

insert into table2 (theIndex,theValue) select theIndex,theValue from OrigTable where theValue>15; 

insert into table2 (theIndex,theValue) 
select a.theIndex,a.theValue 
from table2 b 
join OrigTable a 
on a.theIndex=b.theIndex-1 
where a.theIndex not in (select theIndex from table2) 

insert into table2 (theIndex,theValue) 
select a.theIndex,a.theValue 
from table2 b 
join OrigTable a 
on a.theIndex=b.theIndex+1 
where a.theIndex not in (select theIndex from table2) 



select * from table1 order by theIndex 
select * from table2 order by theIndex 
1

你只需要一個點,它可能不是15.所以,第一個查詢:

select t.* 
from table t 
where t.value <= 15 

而對於第二:

(select t.* 
from table t 
where t.value <= 15 
order by t.value desc 
limit 1 
) union all 
(select t.* 
from table t 
where t.value > 15 
)