我怎样才能在两列选择在数据库中唯一行?

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

我想从一个表中“独立IFY”到另一个数据。 在我的原始表,数据如下所示:

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

用户ID是由两部分组成,USERIDP1和USERIDP2级联。 我想转移都对应于谁拥有QUALIFIER =他们所拥有的任何行真正的用户行,却忽略不具有任何的行的真实QUALIFIER谁的用户。

为了澄清,所有用户12中的行会被转移,而不是用户13的。 那么输出将如下所示:

USERIDP1 USERIDP2 QUALIFIER DATA 1 2 TRUE AB 1 2 CD

所以基本上,我需要找到具有不同的用户ID组件(包括两个独特的领域)的行也具有与QUALIFIER = TRUE一行,并复制所有的,只有那些用户的行。

--------------解决方案-------------

虽然这种嵌套查询将是大表很慢,这可能做到这一点。

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

对于大表,创建一个只包含USERIDP1和USERIDP2列有限定符= TRUE行新辅助表,然后加入这个表使用内部联接类​​似于上面的第二个选项的原始表。 请记住,创建适当的索引。

这应该做的伎俩 - 如果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

Select *
from yourTable
INNER JOIN (Select UserIDP1, UserIDP2 FROM yourTable WHERE Qualifier=TRUE) B
ON yourTable.UserIDP1 = B.UserIDP1 and YourTable.UserIDP2 = B.UserIDP2

如何子查询的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
);

这是MySQL的一个解决方案,但我相信它应该转移到SQL Server很容易地。 使用子查询挑选出的至少有一个真正的“预选赛”行(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)

分类:SQL 时间:2015-03-14 人气:0
本文关键词: SQL,SQL Server 2008中
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.302 (s). 10 q(s)