T-SQL插入到具有子查询的另一个数据库中的select

时间:2015-03-20 15:42:28

标签: sql-server tsql subquery

我想通过此查询将一些数据从一个数据库插入到其他数据库中:

USE [CostDatabase]
GO

INSERT INTO [dbo].[CostAllocationKeyElements]
           ([Guid]
           ,[Created]
           ,[CostAllocationKeyID]
           ,[CostCenterDefinitionID]
           ,[Amount])
     SELECT 
           DivisionKeyLineID,
           GETDATE(),
           DivisionKeyID,
           (SELECT TOP 1 Guid from [dbo].CostCenterDefinitions where CostCenterCode = CostCenterCode),
           GrantAmount
      FROM [TestDB].[dbo].[CSLSTDIVDivisionKeyLines]
GO

但问题在于CostCenterCode,因为我必须将Guid插入CostCenterDefinitionID字段,但是在数据库TestDB的表CSLSTDIVDivisionKeyLines中,我只得到了CostCenterDefinition(CostCenterCode字段)的字符串代码,所以我尝试在子查询中选择Guid但是在每个它只从表中选择相同的第一个Guid。也许不同数据库中列的相同名称是其原因,但我不这么认为。有人能告诉我如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

您需要在子选择中使用别名。例如:

 SELECT 
       [DivisionKeyLineID],
       GETDATE(),
       [DivisionKeyID],
       (SELECT TOP 1 ccd.[Guid] 
          FROM dbo.[CostCenterDefinitions] ccd 
          WHERE 
          ccd.[CostCenterCode] = dkl.[CostCenterCode]),
       [GrantAmount]
  FROM [TestDB].[dbo].[CSLSTDIVDivisionKeyLines] dkl

如果没有别名,我怀疑它只是在costcentrecode子句中将CostCenterDefinitions where与其自身进行比较。

答案 1 :(得分:0)

我认为您需要为表设置别名,以便子查询知道它在比较中查看的CostCenterCode

SELECT 
           DivisionKeyLineID,
           GETDATE(),
           DivisionKeyID,
           (SELECT TOP 1 Guid 
              from [dbo].CostCenterDefinitions ccd 
              where 
                  ccd.CostCenterCode = cslst.CostCenterCode),
           GrantAmount
      FROM [TestDB].[dbo].[CSLSTDIVDivisionKeyLines] cslst

如果您不使用表别名,它只需从CostCenterDefinitions中检查CostCenterCode到自身,返回该表中的所有行(然后返回1,以便每次都获得相同的行)。 / p>

答案 2 :(得分:0)

SQL不知道哪个" CostCenterCode"你指的是......所以它用相同的列/同一行/同一个表进行自我平等检查。您需要将外部表do引用到"相关子查询"。像这样:

INSERT INTO [dbo].[CostAllocationKeyElements]
           ([Guid]
           ,[Created]
           ,[CostAllocationKeyID]
           ,[CostCenterDefinitionID]
           ,[Amount])
     SELECT 
           c.DivisionKeyLineID,
           GETDATE(),
           c.DivisionKeyID,
           (SELECT TOP 1 Guid from [dbo].CostCenterDefinitions where CostCenterCode = c.CostCenterCode),
           c.GrantAmount
      FROM [TestDB].[dbo].[CSLSTDIVDivisionKeyLines] c
GO