选择语句的列是选择语句,但不是子查询。

问题描述 投票:0回答:1

SQL大师。

我不明白这个查询的部分内容。在select语句中,有一些看起来像独立的'select语句',几乎像一个函数。这段代码是供应商编写的Blackbaud CRM。作为独立的代码,在代码中没有连接他们带入数据集的信息,你可以在from子句中看到。最后一个奇怪的项目是,在别名为Spouse_id的列中,SPOUSE.RECIPROCALCONSTITUENTID列甚至不存在于所指的表中。有没有BBCRM的人可以解释一下?

谢谢你

    select
        CONSTITUENT.ID,
        CONSTITUENT.ISORGANIZATION,
        CONSTITUENT.KEYNAME,
        CONSTITUENT.FIRSTNAME,
        CONSTITUENT.MIDDLENAME,
        CONSTITUENT.MAIDENNAME,
        CONSTITUENT.NICKNAME,
        (select SPOUSE.RECIPROCALCONSTITUENTID 
         from dbo.RELATIONSHIP as SPOUSE 
         where SPOUSE.RELATIONSHIPCONSTITUENTID = CONSTITUENT.ID 
           and SPOUSE.ISSPOUSE = 1) as [SPOUSE_ID],
        (select MARITALSTATUSCODE.DESCRIPTION 
         from dbo.MARITALSTATUSCODE 
         where MARITALSTATUSCODE.ID = CONSTITUENT.MARITALSTATUSCODEID) as [MARITALSTATUSCODEID_TRANSLATION]
    From 
        dbo.constituent
    left join 
        dbo.ORGANIZATIONDATA on ORGANIZATIONDATA.ID = CONSTITUENT.ID
    where 
       (CONSTITUENT.ISCONSTITUENT = 1)
sql syntax-highlighting sql-server-2019
1个回答
0
投票

这些是 相关子查询. 虽然没有明确规定 JOIN有一个连接到外表的链接,它的行为就像一个连接(虽然比显式连接更有约束)。JOINs):

(select SPOUSE.RECIPROCALCONSTITUENTID 
 from dbo.RELATIONSHIP as SPOUSE 
 where SPOUSE.RELATIONSHIPCONSTITUENTID = CONSTITUENT.ID AND
-------^ correlation clause connecting to outer table
       SPOUSE.ISSPOUSE = 1
) as [SPOUSE_ID],

这就像一个 LEFT JOIN. 如果没有匹配的行,那么结果就是 NULL.

请注意,在这里,相关的子查询也是一个 标量子查询. 这意味着它只返回一列,最多返回一行。

如果查询返回的列数超过一列,你会在查询中得到一个编译时错误。 如果查询返回多于一行,你会在查询中得到一个运行时错误。

© www.soinside.com 2019 - 2024. All rights reserved.