如何在两列中的数据库中选择唯一行?

时间:2012-04-17 03:23:52

标签: sql sql-server-2008

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

我正在尝试从一个表到另一个表的“unique-ify”数据。在我的原始表中,数据如下所示:

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的行并复制所有这些用户的行。

5 个答案:

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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
         );

答案 4 :(得分:0)

这是mysql的一个解决方案,但我相信它应该很容易转移到sql server。使用子查询选择具有至少一个True'限定符'行的(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)