0

我创建了一个表,并且正在将另一个表中的行插入其中。但是,其中一些行需要来自其他表的连接。据我所知,这意味着在语句中使用子查询选择语句。问题是子查询只返回一个结果,我可能有很多。我想在不存在记录的情况下返回 -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
4

3 回答 3

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
于 2012-05-30T16:50:00.640 回答
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
于 2012-05-30T16:53:26.487 回答
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

   )
于 2012-05-30T16:51:15.797 回答