【问题标题】:Select statement with columns that are select statement but not subqueriesSelect 语句的列是 select 语句但不是子查询
【发布时间】:2020-06-02 04:40:03
【问题描述】:

SQL 大师,

我不明白这个查询的一部分。在选择语句中,有一些看起来像独立的“选择语句”,几乎就像一个函数。此代码是供应商编写的 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 blackbaud


    【解决方案1】:

    这些是相关的子查询。虽然没有显式的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

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

    如果查询返回多于一列,则查询会出现编译时错误。如果查询返回多行,您将在查询中收到运行时错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2015-08-02
      • 2011-05-09
      • 2015-01-21
      • 2014-09-01
      相关资源
      最近更新 更多