1

モードでhttp://sqlfiddle.comに次のテーブルを作成します。PostgreSQL 9.3.1

CREATE TABLE t
(
  id serial primary key,
  m varchar(1),
  d varchar(1),
  c int
);

INSERT INTO t
(m, d, c)
VALUES
('A', '1', 101),
('A', '2', 102),
('A', '3', 103),
('B', '1', 104),
('B', '3', 105);

テーブル:

| ID | M | D |   C |
|----|---|---|-----|
|  1 | A | 1 | 101 |
|  2 | A | 2 | 102 |
|  3 | A | 3 | 103 |
|  4 | B | 1 | 104 |
|  5 | B | 3 | 105 |

これから私はそのようなテーブルを生成したい:

| M | D |     ID |      C |
|---|---|--------|--------|
| A | 1 |      1 |    101 |
| A | 2 |      2 |    102 |
| A | 3 |      3 |    103 |
| B | 1 |      4 |    104 |
| B | 2 | (null) | (null) |
| B | 3 |      5 |    105 |

しかし、私の現在の声明では

select * from
  (select * from
    (select distinct m from t) as dummy1,
    (select distinct d from t) as dummy2) as combi
  full outer join
    t
  on combi.d = t.d and combi.m = t.m

私は次のことしか得られません

| M | D |     ID |      C |
|---|---|--------|--------|
| A | 1 |      1 |    101 |
| B | 1 |      4 |    104 |
| A | 2 |      2 |    102 |
| A | 3 |      3 |    103 |
| B | 3 |      5 |    105 |
| B | 2 | (null) | (null) |

これまでのところ、m,d で並べ替えようとすると失敗します。

select * from
  (select * from
    (select * from
      (select * from
        (select distinct m from t) as dummy1,
        (select distinct d from t) as dummy2) as kombi
      full outer join
        t
      on kombi.d = t.d and kombi.m = t.m) as result)
order by result.m

エラーメッセージ:

ERROR: subquery in FROM must have an alias: select * from (select * from (select * from (select * from (select distinct m from t) as dummy1, (select distinct d from t) as dummy2) as kombi full outer join t on kombi.d = t.d and kombi.m = t.m) as result) order by result.m

誰かが私が間違っていることを指摘し、おそらく正しいステートメントを示すことができれば素晴らしいでしょう.

4

6 に答える 6

2
select * from
  (select kombi.m, kombi.d, t.id, t.c from
    (select * from
      (select distinct m from t) as dummy1,
      (select distinct d from t) as dummy2) as kombi
     full outer join t
  on kombi.d = t.d and kombi.m = t.m) as result
order by result.m, result.d
于 2013-12-18T15:22:20.813 に答える
1

あなたの問題は注文だと思います。この問題は order by 句で解決できます。

select * from
  (select * from
    (select distinct m from t) as dummy1,
    (select distinct d from t) as dummy2) as combi
  full outer join
    t
  on combi.d = t.d and combi.m = t.m
order by combi.m, combi.d

注文するデータを指定する必要があります。この場合、combi テーブルから行を取得するので、それを言う必要があります。 http://sqlfiddle.com/#!15/ddc0e/17

于 2013-12-18T15:15:53.587 に答える
1

名前の代わりに列番号を使用して順序付けを行うこともできます。

select * from
  (select * from
    (select distinct m from t) as dummy1,
    (select distinct d from t) as dummy2) as combi
  full outer join
    t
  on combi.d = t.d and combi.m = t.m
order by 1,2;

| M | D |     ID |      C |
|---|---|--------|--------|
| A | 1 |      1 |    101 |
| A | 2 |      2 |    102 |
| A | 3 |      3 |    103 |
| B | 1 |      4 |    104 |
| B | 2 | (null) | (null) |
| B | 3 |      5 |    105 |
于 2013-12-18T15:17:03.993 に答える
1

ピボットテーブルが必要です

クエリは非常に単純です

select classes.M, p.i as D, t.ID, t.C
from (select M, max(D) MaxValue from t group by m) classes
inner join pivot p
on p.i =< classes.MaxValue
left join t
on t.M = classes.M
and t.D = p.i

ピボットテーブルはどういうわけかダミーテーブルです

CREATE TABLE Pivot (
 i INT,
 PRIMARY KEY(i)
)

populate はどういうわけか

CREATE TABLE Foo(
i CHAR(1)
)

INSERT INTO Foo VALUES('0')
INSERT INTO Foo VALUES('1')
INSERT INTO Foo VALUES('2')
INSERT INTO Foo VALUES('3')
INSERT INTO Foo VALUES('4')
INSERT INTO Foo VALUES('5')
INSERT INTO Foo VALUES('6')
INSERT INTO Foo VALUES('7')
INSERT INTO Foo VALUES('8')
INSERT INTO Foo VALUES('9')

Foo テーブルの 10 行を使用すると、ピボット テーブルに 1,000 行を簡単に入力できます。10 行から 1,000 行を取得するには、Foo を 3 回結合してデカルト積を作成します。

INSERT INTO Pivot
SELECT f1.i+f2.i+f3.i
FROM Foo f1, Foo F2, Foo f3

これについては、Ales Spetic の Jonathan Gennick による Transac-SQL Cookbook を参照してください。

于 2013-12-18T15:31:58.323 に答える
0

別の相関名が必要だと思います-dummy3? - 「as result )」の後、order by の前。

于 2013-12-18T15:21:50.583 に答える