Sql server 带嵌套子句的SQL语句查询

Sql server 带嵌套子句的SQL语句查询,sql-server,tsql,Sql Server,Tsql,出于演示目的,我修改了表名和字段,并简化了SQL问题: 我们有一个名为a的表,只有2列: Name ServiceReceived ========================= Mr A Medical Mr A Dental Mr A HealthCare Mr A Special1 Mr B Dental Mr B HealthCare Mr C Medical Mr C Dental Mr C HealthCare Mr C Special

出于演示目的,我修改了表名和字段,并简化了SQL问题:

我们有一个名为a的表,只有2列:

Name   ServiceReceived
=========================
Mr A   Medical
Mr A   Dental
Mr A   HealthCare
Mr A   Special1
Mr B   Dental
Mr B   HealthCare
Mr C   Medical
Mr C   Dental
Mr C   HealthCare
Mr C   Special
Mr C   Special2 
我需要一份所有修改过医疗或牙科的人的名单

还收到了一到两份Special1和Special2

我试过了

where ServiceReceived in ('medical', 'dental')
  and ServiceReceived in ('Special1', 'Special2')
但这是行不通的

======================================
预期结果:正如您所看到的,MrB不在那里,因为他没有Special1或Special2

 Name   ServiceReceived
    =========================
    Mr A   Medical
    Mr A   Dental
    Mr A   HealthCare
    Mr A   Special1 
    Mr C   Medical
    Mr C   Dental
    Mr C   HealthCare
    Mr C   Special
    Mr C   Special2 

您可以使用聚合和having子句:

选择t* 从t 按名称分组 在“医疗”、“牙科”中接收服务时有sumcase,然后1其他0结束>0和 当服务在“Special1”、“Special2”中接收时,sumcase,然后在1和2之间结束1或0; 如果要查看所有详细信息,可以使用join、in或exists:

选择t* 从t 其中t.name在select name中 从t 按名称分组 在“医疗”、“牙科”中接收服务时有sumcase,然后1其他0结束>0和 sumcase当服务在“Special1”、“Special2”中接收时,则1其他0在1和2之间结束 ; 这应该行得通

SELECT NAME
FROM A
WHERE
    NAME IN (SELECT NAME FROM A AS A2 WHERE A2.ServiceReceived IN ('medical', 'dental'))
    AND NAME IN (SELECT NAME FROM A AS A2 WHERE A2.ServiceReceived IN ('Special1', 'Special2'))
选择名称 从…起 选择名称, SumCase when ServiceRequested='Medical',然后1或0结束为Medical, 请求服务时的SumCase='DETANCAL',然后1或0结束为DETANCAL, SumCase在“Special1”和“Special2”中请求服务时,1或0以Specials结束 来自[dbo]。[服务] 按名称分组 s 其中医疗>=1或牙科>=1,特价>=1
以下解决方案适用于SQL server INTERSECT表运算符

SELECT NAME 
FROM T 
WHERE ServiceReceived IN ('medical', 'dental') 
INTERSECT 
SELECT NAME 
FROM T WHERE 
ServiceReceived IN ('Special1', 'Special2')

还请指定预期结果。请阅读以获取有关改进问题的一些提示。@jarlh我将进一步解释预期结果。谢谢,谢谢,我把这个放进了我的实际SQL中,会让你知道的!您的SQL正确地消除了MrB。但只给我MRA和MrB的结果。我还想看看他们所有的服务名称。就这样!我真正的SQL代码非常复杂。但你的解决方案也适用于此。非常感谢你的帮助!什么是一个在这里?如果您引用的是TableA,您的查询甚至仍然运行。什么是“从A中选择名称作为A2,其中A2.ServiceReceive?”?此SQL不正确。@斯纳什,我修改了Chaim的答案,试图让它更清楚。@斯纳什,查询工作得非常好。只有A先生和C先生进入结果集。如果希望看到不同的值,只需添加一个distinct子句。“A”是表名,就像问题中描述的一样,我们有一个名为A的表