2

次のような2つのクエリがあります:

select id, count(something) selected from table1...;
select id, count(something) rejected from table2...;

最初のクエリは私に与えます

id selected
------------
2  4
3  5

2番目のクエリは私に与えます

id rejected
------------
1  12
3  13

単一のクエリでそれらを次の形式に結合したい

id selected rejected
--------------------
1  null      12
2  4         null 
3  5         13

どうすればこれを達成できますか?

4

3 に答える 3

3

結合のed 結果を組み合わせてをシミュレーSQL Serverトする必要があります (ただし、私の場合はどちらも以前と同じです)FULL OUTER JOINUNIONLEFT and RIGHTLEFT JOIN

SELECT  a.ID, a.selected, b.rejected
FROM    (selectedQuery) a
        LEFT JOIN (rejectedQuery) b
            ON a.ID = b.ID
UNION 
SELECT  a.ID, b.selected, a.rejected 
FROM    (rejectedQuery) a
        LEFT JOIN (selectedQuery) b
            ON a.ID = b.ID

SQLFiddle デモ

更新 1

PostgreSQL のサポートFULL OUTER JOIN(私の悪い点)

SELECT  COALESCE(a.ID,b.id) ID, a.selected, b.rejected
FROM    selectedQuery a
        FULL OUTER JOIN rejectedQuery b
            ON a.ID = b.ID

SQLFiddle デモ

于 2012-10-22T14:02:35.773 に答える
2

データを返す式を考えると、次のようになります。

select
 column1 id,
 column2 selected
from (values (2 , 4),(3, 5)) table1;

 id | selected 
----+----------
  2 |        4
  3 |        5
(2 rows)
select
 column1 id,
 column2 rejected 
from (values (1 , 12),(3, 13)) table2
dbornside-# ;
 id | rejected 
----+----------
  1 |       12
  3 |       13
(2 rows)

通常の内部結合では、正しい結果が得られません。両方の関係の行のみが表示されます

select * from 
     (select column1 id, column2 selected from (values (2 , 4),(3, 5)) table1) table1
join (select column1 id, column2 rejected from (values (1 , 12),(3, 13)) table2) table2 
on table1.id = table2.id;

 id | selected | id | rejected 
----+----------+----+----------
  3 |        5 |  3 |       13
(1 row)

右側のテーブルからすべての行を取得するには、が必要です。right outer join左側の行はleft outer join;です。両方を取得するには、:を使用しfull outer joinます

select * 
from (select column1 id, column2 selected from (values (2 , 4),(3, 5)) table1) table1
FULL OUTER JOIN ( select column1 id, column2 rejected from (values (1 , 12),(3, 13)) table2) table2 
on table1.id = table2.id;

 id | selected | id | rejected 
----+----------+----+----------
  2 |        4 |    |         
  3 |        5 |  3 |       13
    |          |  1 |       12
(3 rows)

しかし、これは少し奇妙に見えます。これは、が;table1.idと同じ列ではないためです。table2.idまた、特定の値が両方のテーブルに存在しないだけです。同じステップでそれらをまとめることができますcoalesce()

select COALESCE(table1.id, table2.id) id,
       selected,
       rejected
from (select column1 id, column2 selected from (values (2 , 4),(3, 5)) table1) table1 
full outer join ( select column1 id, column2 rejected from (values (1 , 12),(3, 13)) table2) table2 
on table1.id = table2.id;

 id | selected | rejected 
----+----------+----------
  2 |        4 |         
  3 |        5 |       13
  1 |          |       12
(3 rows)
于 2012-10-22T14:27:04.110 に答える
-1

id 列で JOIN を使用できますか? 例えば

SELECT s.id, COUNT(s.something) selected, COUNT(r.something) rejected
FROM table1 s
INNER JOIN table2 r ON r.id = s.id
于 2012-10-22T14:02:07.973 に答える