如何选择特定类型并排除查询中的其他类型

时间:2015-10-16 10:44:58

标签: sql sql-server sql-server-2008 ssms ssms-2012

只是想知道是否可以选择仅使用特定类型的行而不是SSMS中的任何其他行。

例如:

╔════════╦══════╗
║ UserID ║ Type ║
╠════════╬══════╣
║      1 ║ A    ║
║      1 ║ B    ║
║      1 ║ C    ║
║      1 ║ D    ║
║      2 ║ D    ║
║      3 ║ A    ║
║      3 ║ C    ║
║      3 ║ D    ║
║      4 ║ B    ║
║      4 ║ C    ║
║      5 ║ C    ║
║      5 ║ D    ║
╚════════╩══════╝

现在,我正在寻找在他们的个人资料中只有D而没有其他内容的用户。对于上面的示例,UserID 2将是查询的结果。

4 个答案:

答案 0 :(得分:0)

您的数据结构非常糟糕,您应该专注于修复它。将值存储在分隔列表中是一个非常糟糕的主意,而不是很好地使用关系数据库。相反,您需要一个UserTypes表,每个用户一行,每个类型一行。

但是,有时候我们会被其他人糟糕的设计选择所困扰。在这种情况下,您特定问题的答案很简单:

select t.*
from t
where Type = 'D';

编辑:

对于改进的数据结构:

select userId
from t
group by userId
having min(type) = 'D' and max(type) = 'D';

答案 1 :(得分:0)

SELECT 
    UserID
FROM
    [Table] 
GROUP BY 
    UserID HAVING COUNT(UserID)=1 and Type='D'

答案 2 :(得分:0)

正如@Gordon所说,你的数据库设计非常差,试图解决它。以下查询无论如何都会完成你的工作 -

CREATE TABLE #UserIDType( UserID int,   Type char(1))
insert into #UserIDType
select 1  ,      'A' union all
select 1 ,       'B' union all
select 1 ,       'C' union all
select 1,        'D' union all
select 2,        'D' union all
select 3,        'A' union all
select 3,        'C' union all
select 3,        'D' union all
select 4,        'B' union all
select 4,        'C' union all
select 5,        'C' union all
select 5,        'D'
select userid,type from
(select *,row_number() over(partition by userid order by userid) rn 
from #useridtype) a 
where type='D' and rn=1

答案 3 :(得分:0)

SELECT DISTINCT T1.*
FROM YourTable T1
LEFT JOIN YourTable T2 ON T1.UserID = T2.UserID AND T2.Type <> 'D'
WHERE T1.Type = 'D' AND T2.UserID IS NULL

说明:

SELECT *
FROM Table
WHERE Type = 'D'

将选择Type =&#39; D&#39;。

的所有记录
SELECT T1.*
FROM Table T1
LEFT JOIN Table T2 ON T1.UserID = T2.UserID AND T2.Type <> 'D'

将选择在&#39; D&#39;

旁边的所有类型的记录

添加WHERE T2.UserID IS NULL选择除了&#39; D&#39;之外没有任何其他类型的记录。

组合这两个结果集得到最终结果。