2012-10-25 333 views
3

我有兩個表,並且我正在每個表上進行有序選擇。我希望在一個結果中看到兩個訂單的結果。SQL並排顯示兩個結果

例(簡體):

"SELECT * FROM table1 ORDER BY visits;" 
name|# of visits 
----+----------- 
AA | 5 
BB | 9 
CC | 12 
. 
. 
. 

"SELECT * FROM table2 ORDER BY spent;" 
name|$ spent 
----+------- 
AA | 20 
CC | 30 
BB | 50 
. 
. 
. 

我想爲兩列顯示的結果,所以我可以在視覺上得到一個感覺,如果最頻繁的遊人也最好的買家。 (我知道這個例子是不好的DB設計,而不是一個真實的情景這是一個例子。)

我想要得到這樣的:

name by visits|name by spent 
--------------+------------- 
AA   | AA 
BB   | CC 
CC   | BB 

我使用SQLite。

+0

which Database? SQL服務器? MySQL的?甲骨文? –

+0

@JoeGJoseph Oops。 SQLite的。 – baruch

回答

1
Select A.Name as NameByVisits, B.Name as NameBySpent 
    From (Select C.*, RowId as RowNumber From (Select Name From Table1 Order by visits) C) A 
    Inner Join 
    (Select D.*, RowId as RowNumber From (Select Name From Table2 Order by spent) D) B 
    On A.RowNumber = B.RowNumber 
+0

這給出了一個完整的交叉連接(上例中的9行) – baruch

+0

I將很快進行編輯,以便使用RowId爲您提供改進的答案。 –

+0

確定在訂購每個表格後使用Rowid進行編輯。然後我使用Inner join使用該RowID連接表。 –

0

剛剛加入表1和表2與名作爲關鍵字像波紋管:

select a.name, 
    b.name, 
    a.NumOfVisitField, 
    b.TotalSpentField 
from table1 a 
left join table2 b on a.name = b.name 
+1

我不希望他們加入名字。這將給我在同一行中的一個名字的結果,而我想要一個行中的最佳買家和最好的訪客(即使名稱不同) – baruch

1

對於支持公共表表達式和窗口功能RDBMS(如SQL服務器,Oracle,PostreSQL),我會用:

WITH most_visited AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY num_visits) AS num, name, num_visits 
    FROM visits 
), 
most_spent AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY amt_spent) AS num, name, amt_spent 
    FROM spent 
) 
SELECT mv.name, ms.name 
FROM most_visited mv INNER JOIN most_spent ms 
ON mv.num = ms.num 
ORDER BY mv.num 
+0

no .. Row_number()在sql lite中不可用 –

2

試試這個

select 
    ISNULL(ts.rn,tv.rn), 
    spent.name, 
    visits.name 
from 
(select *, (select count(*) rn from spent s where s.value>=spent.value) rn from spent) ts 
    full outer join 
(select *, (select count(*) rn from visits v where v.visits>=visits.visits) rn from visits) tv  
    on ts.rn = tv.rn 
order by ISNULL(ts.rn,tv.rn) 

它爲源表中的每個條目創建一個排名,並將它們的排名連接起來。如果有重複的等級,他們會在結果中返回重複項。

0

我知道這是不是一個直接的答案,但我就是這樣的情況下,在用戶搜索需要它:這是當結果是每列僅是一個簡單的解決方案:

select 
    (select roleid from role where rolename='app.roles/anon') roleid, -- the name of the subselect will be the name of the column 
    (select userid from users where username='pepe') userid;   -- same here 

結果:

    roleid    |    userid 
--------------------------------------+-------------------------------------- 
    31aa33c4-4e66-4da3-8525-42689e46e635 | 12ad8c95-fbef-4287-9834-7458a4b250ee