4

1 つ複雑な質問があります。例を挙げて説明します:

主キーを持つテーブルが1つあり、そこに他のテーブルを結合したい最初のテーブルの主キーは外部キーであり、2番目のテーブルに重複した外部キ​​ーがある場合、再現性の数を選択します。例えば:

1 番目のテーブル:

  id    name 
  ---  -----
  1     Greg
  2     Alan 
  3    George 
  4     John 
  5     Peter   

2番目のテーブル

 id       aid        data   
 ---     -----      -------
 1        2          CCCV   
 2        2          VVVV 
 3        3          DDDDD 
 4        3          SSSS 
 5        4          PPPPP 

結合の結果を次のようにしたい:

 id(1st table)  aid   name    Data   Number
 -----------    ----  -----   -----  -----
 1               null  Greg    null   1
 2                1    Alan    CCCV   1
 2                2    Alan    VVVV   2
 3                3    George  DDDDD  1
 3                4    George  SSSS   2
 4                5    John    PPPPP  1
 5               null  Peter   null   1

いろいろ探しましたが、何も見つかりませんでした。検索の仕方がわからないとか、やりたいことがないとか。

4

3 に答える 3

2

私のコメントによると、あなたはこれをMySQLとPostgreSQLの両方にタグ付けしました。

この答えはPostgreSQL用です。

SELECT
  table1.id,
  table2.aid,
  table1.name,
  table2.data,
  ROW_NUMBER() OVER (PARTITION BY table1.id ORDER BY table2.aid) AS number
FROM
  table1
LEFT JOIN
  table2
    ON table1.id = table2.aid
于 2012-10-22T10:54:09.563 に答える
2
SELECT Table1.id, Table2.id as aid, Table1.name, Table2.data,
GREATEST(1, (SELECT COUNT(*)
             FROM Table2 t2
             WHERE t2.aid = Table1.id
             AND t2.id <= Table2.id))
AS number
FROM Table1
LEFT JOIN Table2
ON Table2.aid = Table1.id
ORDER BY id, aid;

MySQL と PostgreSQL の両方で動作します。

于 2012-10-22T12:10:28.637 に答える
0

ウィンドウ関数を持たない PostgreSQL 8.3 のクエリ。
より大きなテーブルでは、通常、相関サブクエリJOINの代わりに aを使用する方がはるかに高速です。 最初のクエリは、に参加するに の値を集計します。これも高速になるはずです。
Table2 Table1

SELECT t1.id, t2.aid, t1.name, t2.data, COALESCE(t2.ct, 1) AS number
FROM   Table1 t1
LEFT   JOIN  (
    SELECT x.aid, x.data, count(y.aid) + 1 AS ct
    FROM   Table2 x
    LEFT   JOIN Table2 y ON x.aid = y.aid AND x.id > y.id
    GROUP  BY x.aid, x.data
    ) t2 ON t2.aid = t1.id
ORDER  BY t1.id, t2.ct;

そしてORDER BY、修正する必要があります。

サブクエリなしの代替。まだ速いかもしれません:

SELECT t1.id, t2.aid, t1.name, t2.data, count(*) + count(t3.id) AS number
FROM   Table1 t1
LEFT   JOIN Table2 t2 ON t2.aid = t1.id
LEFT   JOIN Table2 t3 ON t3.aid = t2.aid AND t3.id < t2.id
GROUP  BY t1.id, t2.aid, t1.name, t2.data
ORDER  BY t1.id, count(t3.id);

よくわかりません。より大きなセットでテストしていません。でパフォーマンスをテストしEXPLAIN ANALYZEます。結果を報告していただけますか?

于 2012-10-22T19:29:51.917 に答える