【问题标题】:SQL Linked Tables, INSERT INTO & JOINsSQL 链接表、INSERT INTO 和 JOIN
【发布时间】:2012-07-17 14:43:36
【问题描述】:

我是新手,所以请温柔。

一直在使用 SQL Server 2008r2 根据从另一台服务器上更大的专有 SQL 数据库中提取的信息创建一个工作数据库。我可以使用 INSERT INTO 函数将信息提取到新表中,但是当我尝试通过连接从链接数据库的另一个表中添加链接字段时,我一无所获。事不宜迟,以下是我的新奇查询:

INSERT INTO [Cust_Info].[dbo].[form_data]
        (CustNo
        ,LastName
        ,FirstName
        ,Add1
        ,Add2
        ,City
        ,State
        ,Zip
        ,Phone1
        ,Phone2
        ,Email)
SELECT      [CustNo]
        ,[LastName]
        ,[FirstName]
        ,[Add1]
        ,[Add2]
        ,[City]
        ,[State]
        ,[Zip]
        ,[Phone1]
        ,[Phone2]
        ,[Email]

FROM [XYZ-SERVER-1\ETC].[Service].[dbo].[Customer]
JOIN [XYZ-SERVER-1\ETC].[Service].[dbo].[EmailInv] 
ON [Cust_Info].[dbo].[form_data].[CustNo]=[XYZ-SERVER-1\ETC].[Service].[dbo].
[EmailInv].[CustNo]

我确定我犯了一个非常菜鸟的错误,但我继续在“ON”行得到“Msg 4104”,在第一行得到“Msg 209”(不明确的列名“CustNo”)选择语句。

我已经整理了不同论坛上的许多相关帖子,根据我的帐户,这应该可以工作。可以请你们中的一位兽医给这个菜鸟亮一下吗?

提前谢谢你。

【问题讨论】:

    标签: sql join linked-server insert-into


    【解决方案1】:

    好吧,我注意到的一件事是您正在尝试 INSERT INTO 您的桌子 [Cust_Info].[dbo].[form_data] 但您不是 JOINingJOIN 语句中的此桌子上。所以你的 JOIN 语法似乎不正确。我猜你想JOIN 这种方式,请注意我使用了别名:

    INSERT INTO [Cust_Info].[dbo].[form_data]
    (
        CustNo
        ,LastName
        ,FirstName
        ,Add1
        ,Add2
        ,City
        ,State
        ,Zip
        ,Phone1
        ,Phone2
        ,Email
    )
    SELECT [CustNo] -- which table is this from select the alias? 
        ,[LastName]
        ,[FirstName]
        ,[Add1]
        ,[Add2]
        ,[City]
        ,[State]
        ,[Zip]
        ,[Phone1]
        ,[Phone2]
        ,[Email]
    
    FROM [XYZ-SERVER-1\ETC].[Service].[dbo].[Customer] c
    JOIN [XYZ-SERVER-1\ETC].[Service].[dbo].[EmailInv] e
        ON c.[CustNo]=e.[CustNo]
    

    但您还需要指定每列来自哪个表。比如SELECT中的[CustNo]在两张表中,你需要哪一张?

    【讨论】:

    • 这成功了。将 ALIAS 分配给 Customer 和 EmailInv 表,并分别位于 SELECT 语句 C 或 E 中的所有字段之前。我的最后几行是:FROM [XYZ-SERVER-1\ETC].[Service].[dbo].[Customer]AS C INNER JOIN [XYZ-SERVER-1\ESC].[Service].[dbo].[ EmailInv] AS E ON C.[CustNo]=E.[CustNo] 现在只是让数据合作的问题。 :) 再次感谢!
    • @HLGEM 感谢您的编辑,显然我在发布之前没有完全重读此内容。 :)
    【解决方案2】:

    那是因为CustNo是两个表中的一个字段,所以SQL不知道该选择哪一个。

    尝试:

    INSERT INTO [Cust_Info].[dbo].[form_data]
            (CustNo
            ,LastName
            ,FirstName
            ,Add1
            ,Add2
            ,City
            ,State
            ,Zip
            ,Phone1
            ,Phone2
            ,Email)
    SELECT      [Customer].[CustNo]
            ,[LastName]
            ,[FirstName]
            ,[Add1]
            ,[Add2]
            ,[City]
            ,[State]
            ,[Zip]
            ,[Phone1]
            ,[Phone2]
            ,[Email]
    
    FROM [XYZ-SERVER-1\ETC].[Service].[dbo].[Customer] 
    JOIN [XYZ-SERVER-1\ETC].[Service].[dbo].[EmailInv] 
    ON [Cust_Info].[dbo].[form_data].[CustNo]=[XYZ-SERVER-1\ETC].[Service].[dbo].
    [EmailInv].[CustNo]
    

    【讨论】:

    • 感谢您的快速回复。这接近所需的!非常感谢!
    • 我想知道为什么我收到了反对票。否决者,请发表评论
    • @duke_of_dork 为什么这个答案是“接近”并且对你不正确?这是一个联接,因此两个表中的 CustNo 字段将相同。不知道你选哪一个
    • ElV- 我没有投反对票。我也需要这些信息,但 bluefeet 击中了头。我确实需要区分这些表,但 ALIAS 概念是我的查询工作的原因。因此,为什么你很亲密,但我没有选择你作为我的答案。我仍然非常感谢您的意见。 :)
    【解决方案3】:

    您在两个表中都有 custno。您应该在其前面加上 Customer.CustNo 来标识源表:

    select Customer.CustNo, . . .
    

    显然,表之间没有其他列重复。通常,在进行连接时,最好在所有引用的列(任何位置)之前加上它们的源表。

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      相关资源
      最近更新 更多