COALESCE与SELECT Statement Lazy是否评估?

时间:2013-05-23 22:36:44

标签: sql-server tsql coalesce

SQL Server 2008相关问题

我有一张表记录了申请信用卡的人

CREATE TABLE [dbo].[CREDITCARD_APPLICATION](
    [CREDITCARD_APPLICATION_ID] [bigint] IDENTITY(1,1) NOT NULL,
    [PRIMARY_CUSTOMER_ID] [int] NOT NULL,
    [SECONDARY_CUSTOMER_ID] [int] NULL,
    [PRIMARY_CARD_ID] [int] NULL,
    [SECONDARY_CARD_ID] [int] NULL,
    [STORE_ID] [int] NULL,
    [CARD_REFERRAL_SOURCE] [nvarchar](50) NULL,
    [CAMPAIGN_CODE] [varchar](30) NULL,
    [CREATED_DATE] [datetime2](3) NOT NULL,
    [CREATED_BY] [varchar](50) NOT NULL,
    [LAST_MODIFIED_DATE] [datetime2](3) NULL,
    [LAST_MODIFIED_BY] [varchar](50) NULL,
    [VERSION] [timestamp] NOT NULL
    )

我还有一个加入此表的视图,包含卡和客户。我需要从此表中获取一条信息,即campaign_code,我在视图中使用嵌套选择的coalesce进行此操作。

SELECT....some data....
    ,coalesce((SELECT TOP 1 CAMPAIGN_CODE FROM dbo.CREDITCARD_APPLICATION cca where     cca.PRIMARY_CARD_ID=cc.card_id ORDER BY cca.CREATED_DATE DESC),
        (SELECT TOP 1 CAMPAIGN_CODE FROM dbo.CREDITCARD_APPLICATION cca     where cca.SECONDARY_CARD_ID=cc.card_id ORDER BY cca.CREATED_DATE DESC))

  AS LatestCampaignCode 

我想知道的是2个select语句是否总是会执行,或者如果它从第一个语句中找到结果,它将停止在那里处理。让这些选择总是执行似乎有点低效,事实上在很多(大多数)情况下,表中没有任何匹配的记录

1 个答案:

答案 0 :(得分:1)

是的,我相信它会执行两个查询(大约90%的置信度),但不一定就像你拥有它们一样。

我不确切知道它的作用,但我猜它会从主查询中获取所有信息,然后它将使用第一个查询中的数据执行类似于第二个查询的连接的操作。然后它将执行第三个查询,类似于仅使用仍具有空值的行的连接。但这取决于优化器如何做到这一点,它实际上可能以与sql语句流动方式不同的方式提取数据。

如果你去看一下执行计划,我说的话会更有意义。我要说的一些事情可能会使事情变得更加清晰。

  1. COALESCE刚刚变成CASE声明,因此同样的规则适用于案例陈述
  2. 您的查询可能会变成连接而不是相关的子查询,我希望查询分析器/优化器能够做到这一点,实际上它是如何执行的。