如何插入许多字段有自己的选择语句的位置?

时间:2012-05-30 16:45:03

标签: sql tsql sql-server-2008-r2

我创建了一个表,我正在将另一个表中的行插入其中。但是,其中一些行需要来自其他表的连接。据我所知,这意味着在语句中使用子查询select语句。问题是子查询只返回一个结果,我可能有很多结果。我想返回没有记录的-1。这是我正在使用的一个例子,但它不起作用:

    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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我会像下面那样重写你的查询。

首先,在查询中使用LEFT OUTER JOIN而不是子查询。这种类型的连接表示“other”表中可能存在一行,但它可能不存在,但我想要一行,无论如何。

既然您知道自己拥有所有行,那么您将需要查看是否存在值。使用简写并通过合并功能更容易维护检查。它基本上是一个值列表(列名,变量或硬编码值),优化器将从列表中选择第一个非空值并使用它。在这里,我们为您的查询提供-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

答案 2 :(得分: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

   )