Sql 如果子查询未引入EXISTS,则只能在选择列表中指定一个表达式-如果子查询

Sql 如果子查询未引入EXISTS,则只能在选择列表中指定一个表达式-如果子查询,sql,vba,subquery,exists,case-when,Sql,Vba,Subquery,Exists,Case When,我正在用VBA创建一个程序,它为不同的国家生成access文件。每个国家的访问文件都需要不同的段,因此我必须以特定于国家的方式生成这些文件。 我的数据来自MS SQL Server,在将SQL查询插入VBA后,我遇到了一个ODBC错误,因此我决定首先在SQL端解决这个问题。 vba代码在tbl_实体表中的实体_id-s上通过for循环,我在该表中有国家,并检查它们的实体_id-s。根据他们的实体ID,他们将拥有所需的段ID 以下是我在SQL中的代码: select case when b.ent

我正在用VBA创建一个程序,它为不同的国家生成access文件。每个国家的访问文件都需要不同的段,因此我必须以特定于国家的方式生成这些文件。 我的数据来自MS SQL Server,在将SQL查询插入VBA后,我遇到了一个ODBC错误,因此我决定首先在SQL端解决这个问题。 vba代码在tbl_实体表中的实体_id-s上通过for循环,我在该表中有国家,并检查它们的实体_id-s。根据他们的实体ID,他们将拥有所需的段ID

以下是我在SQL中的代码:

select case when b.entity_id = 7 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 5, 13)) 
            when b.entity_id = 25 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 13)) 
            when b.entity_id = 462 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 8, 13)) 
            when b.entity_id = 12 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13)) 
            when b.entity_id = 13 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13, 7)) 
            when b.entity_id = 24 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 13, 9, 10))
            else (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 13)) end  
from (select * from sclr.Tbl_entity where entity_id = 7) b

select*from sclr.Tbl_实体(其中实体_id=7是末尾的一部分)只是一个示例,因为它的VBA版本如下所示:

strSQL=当&rsRecSetEntity_ID&=7时选择case,然后选择Segment_ID,Segment_name作为Segment,解释来自sclr.Tbl_Segment,其中Segment_ID位于4、5、13中 strSQL=strSQL&when&rsRecSetEntity_ID&=25,然后选择Segment_ID,Segment_name作为Segment,解释自sclr.Tbl_Segment,其中Segment_ID位于4、1、13中 strSQL=strSQL&when&rsRecSetEntity_ID&=462然后选择Segment_ID,Segment_name作为Segment,解释自sclr.Tbl_Segment,其中Segment_ID位于4、8、13中 strSQL=strSQL&when&rsRecSetEntity_ID&=12,然后选择Segment_ID,Segment_name作为Segment,解释自sclr.Tbl_Segment,其中Segment_ID位于4、1、11、12、13中 strSQL=strSQL&when&rsRecSetEntity\u ID&=13,然后选择Segment\u ID,Segment\u name作为Segment,解释自sclr.Tbl\u Segment,其中Segment\u ID位于4、1、11、12、13、7中 strSQL=strSQL&when&rsRecSetEntity_ID&=24,然后选择Segment_ID,Segment_name作为Segment,解释自sclr.Tbl_Segment,其中Segment_ID位于4、1、11、13、9、10中 strSQL=strSQL&else选择段\ ID,段\名称作为sclr.Tbl\ U段中的段,说明其中4、13中的段\ ID从sclr.Tbl\ U段c结束到tmp\ U段 '-ODBC调用失败 设置qsQuery=dbSet.CreateQueryDef qsQuery.Connect=ConnectionString qsQuery.ReturnsRecords=False qsQuery.SQL=strSQL qsQuery.Execute 如您所见,将有一个记录集值添加到when语句中,select应该基于此运行。 在VBA中,我收到一个“ODBC调用失败”错误,该错误是由不正确的查询引起的;在SQL中,我收到了“当子查询未使用EXISTS引入时,只能在选择列表中指定一个表达式”错误


有人能就此提出建议吗?

据我所知,什么时候……就不是SQL了。它可能是可在MS-SQL server上执行的编程语句,但不能在SQL查询中执行。您无法在case语句中执行您试图执行的操作。Case语句在进入单个列时只能返回单个值。您试图在每个case语句中返回3个值,并将它们填充到一个列中。您需要重新编写查询,将这些列分成3个不同的case语句填充列。rsRecSetEntity_ID中有什么?如果您在循环中运行,请显示循环。这两个查询是不可比较的,因为第二个查询使用了一个不同于的,并运行一个INTO操作。