我只是想得到任何Table1有值的結果。
這是你犯過錯的地方。至少就SQL而言,並不是有的訂單。表格是無序集合,當您提取數據時(如果您願意),您可以將強加給。
SQL語句select
絕對做不保證在返回結果,除非你專門使用order by
或group by
的順序。即使select * from table1
也可以按照DBMS認爲合適的順序返回行,以便將它們提供給您。
如果你想要一個特定的順序,你需要明確地要求。例如,如果您希望他們按房間名稱排序,請在查詢結尾處輸入order by t1.name
。儘管我可能會全力以赴,並使用次要排序順序,請使用order by t1.name, t2.rooms
。
或者,要對這些值進行排序,請添加order by t2.values
。
例如,衝壓此架構/數據爲SQLFiddle:
create table table1(
id integer,
name varchar(10),
v1 integer,
v2 integer,
v3 integer);
insert into table1 (id,name,v1,v2,v3) values (1,'a',103,507,603);
insert into table1 (id,name,v1,v2,v3) values (2,'b',514,415,117);
create table table2 (
val integer,
room varchar(10));
insert into table2(val,room) values (103,'abc');
insert into table2(val,room) values (507,'def');
insert into table2(val,room) values (603,'ghi');
insert into table2(val,room) values (514,'jkl');
insert into table2(val,room) values (415,'mno');
insert into table2(val,room) values (117,'pqr');
,然後執行:
select t2.val, t2.room, t1.name from table2 t2
inner join table1 t1 on t1.v1 = t2.val
or t1.v2 = t2.val
or t1.v3 = t2.val
爲我們提供了一個任意排序(它可能看喜歡它的訂貨由內name
rooms
但不能保證):
| val | room | name |
|-----|------|------|
| 103 | abc | a |
| 507 | def | a |
| 603 | ghi | a |
| 514 | jkl | b |
| 415 | mno | b |
| 117 | pqr | b |
當我們改變這種排序上的兩個下行鍵order by t1.name desc, t2.room desc
,我們可以看到它基於該重新排序:
| val | room | name |
|-----|------|------|
| 117 | pqr | b |
| 415 | mno | b |
| 514 | jkl | b |
| 603 | ghi | a |
| 507 | def | a |
| 103 | abc | a |
最後,改變排序子句order by t2.val asc
,我們得到它在價值秩序:
| val | room | name |
|-----|------|------|
| 103 | abc | a |
| 117 | pqr | b |
| 415 | mno | b |
| 507 | def | a |
| 514 | jkl | b |
| 603 | ghi | a |
最後,如果你的目的是通過列的順序每一行來訂購吧(所以順序是從左到右v1
,v2
,v3
,你可以引入一個人工排序鍵,或者通過使用case
語句來根據匹配的列進行選擇,或者通過運行多個可能更有效的查詢:
- 你不執行每行的功能,它往往不規模非常好;而在更大的DBMS」
- ,它們可以被並行化。
的多個查詢選項會去是這樣的:
select 1 as minor, t2.val as val, t2.room as room, t1.name as name from table2 t2
inner join table1 t1 on t1.v1 = t2.val
union all select 2 as minor, t2.val as val, t2.room as room, t1.name as name from table2 t2
inner join table1 t1 on t1.v2 = t2.val
union all select 3 as minor, t2.val as val, t2.room as room, t1.name as name from table2 t2
inner join table1 t1 on t1.v3 = t2.val
order by name, minor
,併產生:
| minor | val | room | name |
|-------|-----|------|------|
| 1 | 103 | abc | a |
| 2 | 507 | def | a |
| 3 | 603 | ghi | a |
| 1 | 514 | jkl | b |
| 2 | 415 | mno | b |
| 3 | 117 | pqr | b |
你可以看到有它使用name
作爲主鍵和值的位置在行中作爲次要關鍵。
現在有些人可能認爲它一個醜陋的方式引進一個假的列排序,但它是爲提高性能久經考驗的方法。但是,你不應該相信我(或任何人)。我的主要口頭優化是措施,不要猜測。
這就是如何有用。如果您想要特定訂單,請始終使用ORDER BY子句。 – jarlh
@jarlh如果我不想要任何特定的訂單,該怎麼辦?任何方式在那裏? –
簡單,只是跳過ORDER BY ... – jarlh