1

同様の解決策をオンラインで見つけましたが、特定の問題に適用できたものはありません。

あるテーブルから別のテーブルにデータを「一意化」しようとしています。元のテーブルでは、データは次のようになります。

USERIDP1    USERIDP2     QUALIFIER     DATA
1           2            TRUE          AB
1           2                          CD
1           3                          EF
1           3                          GH

ユーザー ID は、連結された USERIDP1 と USERIDP2 の 2 つの部分で構成されます。所有する行に QUALIFIER=TRUE を持つユーザーに対応するすべての行を転送したいのですが、どの行にも TRUE QUALIFIER を持たないユーザーは無視します。

明確にするために、ユーザー 12 の行はすべて転送されますが、ユーザー 13 の行は転送されません。出力は次のようになります。

USERIDP1    USERIDP2     QUALIFIER     DATA
1           2            TRUE          AB
1           2                          CD

したがって、基本的には、QUALIFIER=TRUE の行も所有する個別のユーザー ID コンポーネント (2 つの一意のフィールドを含む) を含む行を見つけて、それらのユーザーのすべての行のみをコピーする必要があります。

4

5 に答える 5

4

このネストされたクエリは大きなテーブルでは非常に遅くなりますが、これで十分です。

SELECT DISTINCT X.USERIDP1, X.USERIDP2, X.QUALIFIER, X.DATA
FROM YOUR_TABLE_NAME AS X
WHERE EXISTS (SELECT 1 FROM YOUR_TABLE_NAME AS Y WHERE Y.USERIDP1 = X.USERIDP1
              AND Y.USERIDP2 = X.USERIDP2 AND Y.QUALIFIER = TRUE)

それ自体との内部結合としても記述できます。

SELECT DISTINCT X.USERIDP1, X.USERIDP2, X.QUALIFIER, X.DATA
FROM YOUR_TABLE_NAME AS X
INNER JOIN YOUR_TABLE_NAME AS Y ON Y.USERIDP1 = X.USERIDP1
                                AND Y.USERIDP2 = X.USERIDP2 AND Y.QUALIFIER = TRUE

大規模なテーブルの場合、QUALIFIER = TRUE の行の USERIDP1 列と USERIDP2 列のみを含む新しい補助テーブルを作成し、上記の 2 番目のオプションと同様の内部結合を使用して、このテーブルを元のテーブルと結合します。適切なインデックスを作成することを忘れないでください。

于 2012-04-17T03:35:51.867 に答える
1

これでうまくいくはずです-idフィールドが整数として保存されている場合は、Varcharに変換/キャストする必要があります

SELECT 1 as id1,2 as id2,'TRUE' as qualifier,'AB' as data into #sampled
UNION ALL SELECT 1,2,NULL,'CD' 
UNION ALL SELECT 1,3,NULL,'EF'
UNION ALL SELECT 1,3,NULL,'GH'

   ;WITH data as
    (
    SELECT
    id1 
    ,id2 
    ,qualifier
    ,data
    ,SUM(CASE WHEN qualifier = 'TRUE' THEN 1 ELSE 0 END) 
        OVER (PARTITION BY id1 + '' + id2) as num_qualifier
    from #sampled
    )
    SELECT 
    id1
    ,id2
    ,qualifier
    ,data
    from data
    where num_qualifier > 0
于 2012-04-17T07:26:47.973 に答える
0

これは mysql での解決策ですが、SQL サーバーに簡単に転送できると思います。サブクエリを使用して、少なくとも 1 つの True 'qualifier' 行を持つ (id1, id2) の組み合わせのグループを選択します。次に、それを (id1, id2) の元のテーブルに結合します。

mysql> SELECT u1.*
       FROM users u1
       JOIN (SELECT id1,id2
             FROM users
             WHERE qualifier
             GROUP BY id1, id2) u2
       USING(id1, id2);

+------+------+-----------+------+
| id1  | id2  | qualifier | data |
+------+------+-----------+------+
|    1 |    2 |         1 | aa   |
|    1 |    2 |         0 | bb   |
+------+------+-----------+------+
2 rows in set (0.00 sec)
于 2012-04-17T03:44:57.123 に答える
0

where句としてのサブクエリはどうですか?

SELECT *
  FROM theTable t1
 WHERE CAST(t1.useridp1 AS VARCHAR) + CAST(t1.useridp2 AS VARCHAR) IN
         (SELECT CAST(t2.useridp1 AS VARCHAR) + CAST(t.useridp2 AS VARCHAR)
            FROM theTable t2
           WHERE t2.qualified
         );
于 2012-04-17T03:43:02.277 に答える
0
Select * 
from yourTable
INNER JOIN (Select UserIDP1, UserIDP2 FROM yourTable WHERE Qualifier=TRUE) B
ON yourTable.UserIDP1 = B.UserIDP1 and YourTable.UserIDP2 = B.UserIDP2
于 2012-04-17T03:38:09.283 に答える