2012-10-25 291 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