我想通过此查询将一些数据从一个数据库插入到其他数据库中:
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。也许不同数据库中列的相同名称是其原因,但我不这么认为。有人能告诉我如何解决这个问题?
答案 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