4

我有两个表,并且正在对每个表进行有序选择。我希望在一个结果中看到两个订单的结果。

示例(简化):

"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
.
.
.

我想将结果显示为两列,这样我就可以直观地感受到最常访问的访问者是否也是最好的买家。(我知道这个例子是糟糕的数据库设计,而不是真实的场景。这是一个例子)

我想得到这个:

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

我正在使用 SQLite。

4

5 回答 5

3
    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
于 2012-10-25T09:06:27.450 回答
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)

它为源表中的每个条目创建一个等级,并将两者的等级连接起来。如果有重复的排名,他们将在结果中返回重复的。

于 2012-10-25T09:10:47.377 回答
2

我知道这不是一个直接的答案,但我一直在寻找它,以防有人需要它:这是一个更简单的解决方案,适用于每列只有一个结果:

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
于 2017-02-17T17:09:35.180 回答
1

对于支持公用表表达式和窗口函数(例如,SQL Server、Oracle、PostreSQL)的 RDBMS,我会使用:

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
于 2012-10-25T09:08:29.373 回答
0

只需将 table1 和 table2 与名称作为键连接,如下所示:

select a.name, 
   b.name, 
   a.NumOfVisitField, 
   b.TotalSpentField 
from table1 a
left join table2 b on a.name = b.name
于 2012-10-25T09:06:08.480 回答