Sql server 带嵌套子句的SQL语句查询
出于演示目的,我修改了表名和字段,并简化了SQL问题: 我们有一个名为a的表,只有2列: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
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的表