【问题标题】:How to correctly word an inner join如何正确表达内部连接
【发布时间】:2020-02-03 07:10:06
【问题描述】:

我正在努力学习联接,并在这里(SOFlow)和其他几个地方进行了广泛阅读,当然还复制了代码并进行了尝试。

所以我做了这个代码来适应我的桌子:

SELECT
    a.FIRSTNAME, a.LASTNAME, 
    b.[LINE1], b.[LINE2], b.[LINE3], b.[SUBURB], 
    b.[STATE], b.[POSTCODE], 
    p.[PRIVATE], p.[BUSINESS], p.[MOBILE]
FROM
    (SELECT 
         a.UNIQID, a.FIRSTNAME, a.LASTNAME 
     FROM [PTPARTY]) a
INNER JOIN
    (SELECT 
         [LINE1], [LINE2], [LINE3], [SUBURB], [STATE], [POSTCODE], PARTYID 
     FROM 
         [PTAddresses]
     WHERE 
         ADDRESS_TYPE = 'Mailing') b ON a.Uniqid = b.Partyid
INNER JOIN
    (SELECT 
         [Uniqid], [PRIVATE], [BUSINESS], [MOBILE]
     FROM [PTPhone]) P ON a.Uniqid = P.Uniqid
WHERE
    a.UNIQID = 4

但我明白了:

消息 4104,第 16 级,状态 1,第 3 行
无法绑定多部分标识符“a.UNIQID”。

消息 4104,第 16 级,状态 1,第 3 行
无法绑定多部分标识符“a.FIRSTNAME”。

消息 4104,第 16 级,状态 1,第 3 行
无法绑定多部分标识符“a.LASTNAME”。

这段代码表现完美

SELECT
    a.FIRSTNAME, a.LASTNAME, 
    b.[LINE1], b.[LINE2], b.[LINE3], b.[SUBURB], b.[STATE], b.[POSTCODE],
    p.[PRIVATE], p.[BUSINESS], p.[MOBILE]
FROM
    (SELECT 
         PTPARTY.UNIQID, PTPARTY.FIRSTNAME, PTPARTY.LASTNAME 
     FROM [PTPARTY]) a
INNER JOIN
    (SELECT 
         [LINE1], [LINE2], [LINE3], [SUBURB], [STATE], [POSTCODE], PARTYID 
     FROM 
         [PTAddresses]
     WHERE
         ADDRESS_TYPE = 'Mailing') b ON a.Uniqid = b.Partyid
INNER JOIN
    (SELECT 
         [Uniqid], [PRIVATE], [BUSINESS], [MOBILE]
     FROM [PTPhone]) P ON a.Uniqid = P.Uniqid
WHERE
    a.UNIQID = 4

我 99% 确定不工作的代码是从这里复制的,当然还有一些更改以适合我的表格。

只是想知道我是不是做错了什么。

好吧,我确定我做错了什么,但想知道是什么。

向大家问好,继续努力

【问题讨论】:

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


    【解决方案1】:

    您正在限定子查询中的列,但没有对应的表别名:

    Select p.FIRSTNAME, p.LASTNAME, a.[LINE1],
           a.[LINE2], a.[LINE3], a.[SUBURB], a.[STATE], a.[POSTCODE],
           ph.[PRIVATE], ph.[BUSINESS], ph.[MOBILE]
     from PTPARTY p inner join
          PTAddresses a
          on p.Uniqid = a.Partyid inner join
          PTPhone ph
          on p.Uniqid = Ph.Uniqid
    where a.ADDRESS_TYPE = 'Mailing' and p.UNIQID = 4;
    

    这真的要简单得多。 请注意,我将表别名替换为含义别名。但是,您不需要子查询:

    【讨论】:

    • 你们真是太棒了......你可能不会相信这一点,但我花了 3 天时间,哦,这个,找不到任何东西......哇,我只能说......现在我只需要弄清楚如何投票......我会尽力给你们所有人投票,但我会从头开始,非常感谢你们
    • 刚刚给大家投了赞成票,但它马上又回到了 0。我将不得不阅读这样做
    • @Pthanner 。 . .谢谢你。但是在达到一定数量的分数之前,您不能投票。作为 OP,您可以接受一个您认为是您问题的最佳答案的答案。
    【解决方案2】:

    检查此代码。这将起作用。该错误是由于第一个子查询导致的,因为在第一个子查询中您没有为表设置别名但使用了 alias.column 名称。所以改成下面这样:

    Select a.FIRSTNAME,a.LASTNAME, b.[LINE1],b.[LINE2],b.[LINE3],b.[SUBURB],b.[STATE],b.[POSTCODE],p.[PRIVATE],p.[BUSINESS],p.[MOBILE]
     from
    (SELECT UNIQID,FIRSTNAME,LASTNAME FROM [PTPARTY]) a
    inner join
    (SELECT [LINE1],[LINE2],[LINE3],[SUBURB],[STATE],[POSTCODE],PARTYID FROM [PTAddresses]
      where ADDRESS_TYPE = 'Mailing') b on a.Uniqid = b.Partyid
    inner join
    (SELECT [Uniqid],[PRIVATE],[BUSINESS],[MOBILE]FROM [PTPhone]) P on a.Uniqid = P.Uniqid
    where a.UNIQID = 4
    

    【讨论】:

      【解决方案3】:

      为了帮助非常具体:

      考虑查询的这一部分:

      FROM
          (SELECT 
               a.UNIQID, a.FIRSTNAME, a.LASTNAME 
           FROM [PTPARTY]) a
      

      当您从子查询中删除括号时,您会得到:

       SELECT 
           a.UNIQID, a.FIRSTNAME, a.LASTNAME 
       FROM [PTPARTY]
      

      项目a.UNIQUID 的格式为表别名列名。但是,在括号内,您没有为 [PTPARTY] 指定表别名。因此,a.UNIQUID 无效。

      由于只有 1 个表,因此不需要别名或表引用。为了清楚起见,我将从这里添加可选“AS”。只有 1 个表,您可以只使用列名来执行此操作:

      FROM
          (SELECT 
               UNIQID, FIRSTNAME, LASTNAME 
           FROM [PTPARTY]) AS a
      

      当然,您经常会连接表并希望使用别名,因此您可以在括号内执行此操作:

      FROM
          (SELECT 
               z.UNIQID, z.FIRSTNAME, z.LASTNAME 
           FROM [PTPARTY] AS z) AS a
      

      在这种情况下,表别名“z”在括号外不可用/无效。因此,即使这可能不是最佳实践,您甚至可以重复使用相同的别名。不过,这又会让人感到困惑

      FROM
          (SELECT 
               a.UNIQID, a.FIRSTNAME, a.LASTNAME 
           FROM [PTPARTY] AS a) AS a
      

      【讨论】:

      • 我接受了 Avery_larry 的回答,因为他是第一个回答并得到最好解释的人,但你没事
      猜你喜欢
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多