2012-05-30 29 views
0

我创建了一个表,我正在从另一个表插入行的过程中。但是,其中一些行需要从其他表中加入。据我所知,这意味着在声明中使用子查询select语句。问题是子查询只返回一个结果,我可能有很多。我想在没有记录存在的情况下返回-1。下面是我使用的一个例子,但它不工作:如何插入许多字段都有自己的Select语句?

INSERT INTO [BDW_ReportPrototype].[dbo].[CustomerCreditFact] 
    ([MortgageDimID] 
     ,[LeaseDimID] 
     ,[OREODimID] 
     ,[OfficerTypeDimID]) 
    SELECT 
    --[MortgageDimID] 
-2 
    --LeaseDimID 
,-2 
    --OREODimID 
,-2 
,CASE WHEN OfficerTypeDimID IS NULL THEN -1 ELSE OfficerTypeDimID END 
FROM Staging_FDB_LN_CPDM_Daily LCD 
LEFT OUTER JOIN ERMA..OfficerTypeDim OTD on OTD.OfficerNum = LCD.OFFICER 
FROM dbo.Staging_FDB_LN_CPDM_Daily 
+0

请告诉我们您正在使用哪个rdbms并标记帖子。 –

+0

对不起,SQL 2008 R2 – John

回答

2

试试这个SQL语句

SELECT CASE WHEN OfficerTypeDimID IS NULL THEN -1 ELSE OfficerTypeDimID END 
    FROM Staging_FDB_LN_CPDM_Daily LCD 
    LEFT OUTER JOIN ERMA..OfficerTypeDim OTD on OTD.OfficerNum = LCD.OFFICER 
+0

谢谢!我只是试了一下,我收到一个syntex错误,但我知道这不是你的代码。我有几个领域,我插入数据,你给我一个解决方案,其中之一。 FROM dbo.Staging_FDB_LN_CPDM_Daily语法的最后一个在'FROM'上有错误,说明我有语法错误。有什么建议么? – John

+0

你可以发布你的完整查询吗? –

+0

我可以通过电子邮件发送给您吗?有问题将其添加到评论 – John

0

或许真的沿着这些线路...

INSERT INTO [BDW_ReportPrototype].[dbo].[CustomerCreditFact] 
    ([OfficerTypeDimID]) 
    Select OfficerTypeDimID 
     from ERMA..OfficerTypeDim OTD 
     inner JOIN Staging_FDB_LN_CPDM_Daily LCD 
     on OTD.OfficerNum = LCD.OFFICER 
    UNION ALL 
    SELECT -1 
    FROM dbo.Staging_FDB_LN_CPDM_Daily LCD 
    WHERE NOT EXISTS 
    (
    Select OfficerTypeDimID from ERMA..OfficerTypeDim 
    OTD 
    WHERE 
    OTD.OfficerNum = LCD.OFFICER 

    ) 
1

我想你返工查询如下。

首先,在查询中使用LEFT OUTER JOIN而不是子查询。这种连接类型表示一行可能存在于“其他”表中,但它可能不会,但我希望返回一行。

现在你知道你将拥有所有的行,你会想知道是否有值。使用简写并通过聚结功能更容易保持检查。它基本上是一个值列表(列名,变量或硬编码值),优化器将从列表中选择第一个非空值并使用它。这里我们供应-1为您的查询

INSERT INTO 
    [BDW_ReportPrototype].[dbo].[CustomerCreditFact] 
(
    [OfficerTypeDimID] 
) 
SELECT 
    -- coalesce returns the first non-null value 
    COALESCE(OTD.OfficerTypeDimID, -1) AS OfficerTypeDimID 
FROM 
    dbo.Staging_FDB_LN_CPDM_Daily LCD 
    LEFT OUTER JOIN 
     ERMA..OfficerTypeDim OTD 
     ON OTD.OfficerNum = LCD.OFFICER 
相关问题