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语句是否总是会执行,或者如果它从第一个语句中找到结果,它将停止在那里处理。让这些选择总是执行似乎有点低效,事实上在很多(大多数)情况下,表中没有任何匹配的记录
答案 0 :(得分:1)
是的,我相信它会执行两个查询(大约90%的置信度),但不一定就像你拥有它们一样。
我不确切知道它的作用,但我猜它会从主查询中获取所有信息,然后它将使用第一个查询中的数据执行类似于第二个查询的连接的操作。然后它将执行第三个查询,类似于仅使用仍具有空值的行的连接。但这取决于优化器如何做到这一点,它实际上可能以与sql语句流动方式不同的方式提取数据。
如果你去看一下执行计划,我说的话会更有意义。我要说的一些事情可能会使事情变得更加清晰。