1

整数値を含む column1 と column2 の 2 つの列を持つ match という SQLite テーブルがあります。

column1   column2
------------------

5          6
6          8
8          9
90         91
1          20
10         20

検索結果が次のようになるように、どちらかの列で見つかった重複した数値を照合し、一致する 2 番目の値を含めてそれらを結合します。

5, 6, 8, 9 
1, 20, 10

(90 と 91 は一致しないため、含まれていないことに注意してください)。

これを作成する際の私の「推測」は次のとおりです。

SELECT column1, column2 
FROM match 
WHERE column2 
IN (SELECT column1 
    FROM match 
    GROUP BY column1 HAVING (COUNT(column1) > 0)) 
    UNION 
    SELECT column1, column2 
    FROM match 
    WHERE column1 
    IN (SELECT column2 
        FROM match 
        GROUP BY column1 HAVING (COUNT(column2) > 0)) 
        UNION 
        SELECT column1, column2 
        FROM match 
        WHERE column1 
        IN (SELECT column1
            FROM match 
            GROUP BY column1 HAVING (COUNT(column1) > 1)) 
            UNION 
            SELECT column1, column2 
            FROM match 
            WHERE column2 
            IN (SELECT column2 
                FROM match 
                GROUP BY column2 HAVING (COUNT(column2) > 1)) 

結果はほとんど私が必要とするものです:

5 6
6 8
8 9
1 20
10 20

しかし、私が本当に必要としているのは、結果を何らかの方法でグループ化することです。例えば:

(5, 6, 8, 9) (1, 10, 20)

これは可能ですか?また、私の SQL の試行は複雑すぎますか?

4

1 に答える 1

1

これがあなたが望むものだと思います:http://sqlfiddle.com/#!7/05747/9

SELECT column1 as newColumn
FROM match WHERE column1 in (

SELECT myColumn
FROM(

SELECT count(*) as cnt, myColumn
FROM (
SELECT column1 as myColumn
FROM match
UNION ALL
SELECT column2 as myColumn
FROM match
 ) x
GROUP BY myColumn
HAVING cnt > 1
  ) y
) OR column2 in (
SELECT myColumn
FROM(

SELECT count(*) as cnt, myColumn
FROM (
SELECT column1 as myColumn
FROM match
UNION ALL
SELECT column2 as myColumn
FROM match
 ) x
GROUP BY myColumn
HAVING cnt > 1
  ) y
)
UNION
SELECT column2 as newColumn
FROM match WHERE column1 in (

SELECT myColumn
FROM(

SELECT count(*) as cnt, myColumn
FROM (
SELECT column1 as myColumn
FROM match
UNION ALL
SELECT column2 as myColumn
FROM match
 ) x
GROUP BY myColumn
HAVING cnt > 1
  ) y
) OR column2 in (
SELECT myColumn
FROM(

SELECT count(*) as cnt, myColumn
FROM (
SELECT column1 as myColumn
FROM match
UNION ALL
SELECT column2 as myColumn
FROM match
 ) x
GROUP BY myColumn
HAVING cnt > 1
  ) y
)
于 2012-10-24T23:05:27.037 に答える