2016-11-08 34 views
0

行的順序我有2個表的Postgres如何保持使用CTE

students: 

     id | name | age 
     1  abc 20 
     2  xyz 21 

scores: 

    id | studentid | marks 
    1  1  20 
    2  2  22 
    3  2  20 
    4  1  22 
    5  1  20 

其中studentid是外鍵的學生表

當做

select studentid 
from scores 
where marks=20; 

我得到以下結果 1, 2, 1

但是如果wan t爲學生姓名的名字,當我做了加入使用

select t1.name 
from students t1 
inner join scores t2 on t1.id = t2.studentid 
where t2.marks=20; 

我得到xyz,abc,abc雖然輸出中正確的是我有什麼辦法可以維持在得分在得分表中列出的順序?我應該得到abc,xyz,abc作爲輸出。我也嘗試使用子查詢以及

SELECT name 
FROM students 
WHERE ID IN (select studentid from scores where marks=20) ; 

但這也沒有給我正確的順序。如何使用CTE(公用表表達式)實現這一點?我試過follownig CTE,但它沒有工作

with cte as(
    select t2.id, t1.name 
    from students t1 
    inner join scores t2 on t1.id = t2.studentid 
    where t2.marks=20) 
select name from cte order by id 
+1

的*** ***唯一的方式得到一個保證的順序是使用'order by'。我不清楚哪個是你的命令,但可能是't2.id'命令? –

+0

沒有訂單將按任何列升序或降序排序。正如你所看到的,我想在分數表中保持秩序。學生ID 1,3,5。這是一個巧合,1,3,5按升序排列。 – aaj

+2

沒有「分數表中的訂單」這樣的事情。關係數據庫中的行不是***「排序」的。在您的結果中唯一的(真的:只有**)**方式才能獲得定義的訂單,方法是使用'order by'。 –

回答

1

您可以在選擇列表中不存在的列順序:

select t1.name 
from students t1 
inner join scores t2 on t1.id = t2.student_id 
where t2.marks=20 
order by t2.id; 

name 
------ 
abc 
xyz 
abc 
(3 rows) 
+0

謝謝klin :)這是一個很好的黑客! – aaj