我在网上找到了类似的解决方案,但没有一个我能够应用于我的具体问题。
我正在尝试从一个表到另一个表的“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的行并复制所有这些用户的行。
答案 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)