2012-10-25 5 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 설계가 아닌 실제 시나리오 알고 그것은 예입니다.)

내가 이것을 싶어 : 나는 SQLite는 사용하고

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

.

+0

어느 데이터베이스? SQL 서버? mysql? 신탁? –

+0

@JoeGJoseph 죄송합니다. 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

Ok 각 테이블을 주문한 후 Rowid를 사용하여 편집 됨. 그런 다음 Inner join을 사용하여 RowID를 사용하는 테이블을 연결했습니다. –

0

그냥 울부 짖는 소리처럼 키로서 이름으로 표 1과 표 2에 가입 : 공통 테이블 표현식과 윈도우 기능을 지원하는 RDBMS에 대한

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

나는 그들이 이름으로 합류되기를 원하지 않는다. 동일한 행에 하나의 이름으로 된 결과를 줄 것입니다. 가장 좋은 구매자와 가장 좋은 방문자를 다른 행으로 지정하려는 경우 – baruch

1

(예를 들어, SQL 서버, 오라클, 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

아니요. 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 
관련 문제