1

我在网上找到了类似的解决方案,但没有一个能够应用于我的具体问题。

我正在尝试将数据从一个表“唯一化”到另一个表。在我的原始表格中,数据如下所示:

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

用户 ID 由两部分组成,USERIDP1 和 USERIDP2 连接在一起。我想传输与在他们拥有的任何行中具有 QUALIFIER=TRUE 的用户相对应的所有行,但忽略在其任何行中没有 TRUE QUALIFIER 的用户。

澄清一下,将转移用户 12 的所有行,但不会转移用户 13 的所有行。输出将如下所示:

USERIDP1    USERIDP2     QUALIFIER     DATA
1           2            TRUE          AB
1           2                          CD

所以基本上,我需要找到具有不同用户 ID 组件(涉及两个唯一字段)的行,这些行也具有 QUALIFIER=TRUE 的行,并复制所有且仅所有这些用户的行。

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 列的新辅助表,然后使用类似于上面第二个选项的内部连接将此表与原始表连接。请记住创建适当的索引。

于 2012-04-17T03:35:51.867 回答
1

这应该可以解决问题 - 如果 id 字段存储为整数,那么您将需要转换/转换为 Varchars

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
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 回答
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

这是mysql中的一个解决方案,但我相信它应该很容易转移到sql server。使用子查询挑选出具有至少一个 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 回答