【问题标题】:SQL Server: Join with ambiguous name columnsSQL Server:加入不明确的名称列
【发布时间】:2018-01-09 13:45:29
【问题描述】:

我在 SQL Server 中有两个表(我删除了很多行,但应该不会影响结果):

[dbo].[订单]:

CaseId    Gender
-----------------
698       Female
694       Male
676       Female
659       Male

[dbo].[Plimplan]:

OrderID     CaseID            InfoID              
--------------------------------------------
33425999      698             BBBBBE           
33425984      694             AAAAAS           
33425984      694             DSSSAS             
33425609      694             BBBBBA           
33425270      676             AAAAAA           
33424973      676             AAAAAD           
33424716      676             SASSAS           
33424704      676             AAAAAA           
33424500      676             BBBBBE           
33424340      659             AAAAAA           
33424281      659             BBBBBD           

我想获得以下:

[dbo].[Plimplan]:

OrderID     CaseID            InfoID          Gender      
----------------------------------------------------
33425984      694             AAAAAS           Male
33425270      676             AAAAAA           Female
33424340      659             AAAAAA           Male

让我们忘记加入。我可以从 [dbo].[Order] 中删除不需要的行:

 SELECT TOP (100) MAX (OrderID) AS [OrderID]
  ,MAX (CaseID) AS [CaseID]
  ,MAX (InfoID) AS [InfoID] 
  /*,[Gender]*/

  FROM [dbo].[Plimplan] as Plimpl
  /* INNER JOIN [dbo].[Order] as Ord
  ON Plimpl.CaseID = Ord.CaseID */

  WHERE [InfoID] NOT LIKE 'BBBBB%'
  and CaseID < 700
  and CaseID > 600
  GROUP BY (CaseID)
  order by CaseID desc

但如果我删除 cmets 以完成加入,我会收到此错误:

消息 209,第 16 级,状态 1,第 3 行 不明确的列名称“CaseID”。

【问题讨论】:

  • 你在下面有很好的答案,但我不禁想到,如果你只是用你的问题的标题在谷歌上搜索,你可以自己找到这个
  • 我来这里之前做过。实际上我错过了复制粘贴中的别名,但我在除“SELECT”之外的所有地方都使用了它们,这导致了错误。我不明白我可以在代码中声明之前使用它们...

标签: sql-server join ambiguous


【解决方案1】:

使用别名。您得到的错误是由于连接中的两个表都有一个 CaseID 列。 SQL Server 告诉您它无法确定您要选择哪个

SELECT TOP 100
    MAX (Plimpl.OrderID) AS [OrderID]
    MAX (Plimpl.CaseID)  AS [CaseID]
    MAX (Plimpl.InfoID)  AS [InfoID] 
FROM [dbo].[Plimplan] AS Plimpl
INNER JOIN [dbo].[Order] AS Ord
     ON Plimpl.CaseID = Ord.CaseID
WHERE
    Plimpl.[InfoID] NOT LIKE 'BBBBB%' AND
    Plimpl.CaseID < 700 AND
    Plimpl.CaseID > 600
GROUP BY
    Plimpl.CaseID
ORDER BY
    Plimpl.CaseID DESC;

您显然曾经从Order 表中选择Gender 列,但是使用GROUP BY 这样做是没有意义的。

【讨论】:

  • 您忘记了 ,MAX (Gender) AS [Gender] ,但感谢您的回答。实际上我的问题是我不明白我可以在代码中声明之前给你起别名。
【解决方案2】:

当您取消注释 JOIN 语句时,您会收到错误消息吗?

使用别名

 SELECT TOP (100) MAX (OrderID) AS [OrderID]
  ,MAX (CaseID) AS [CaseID]
  ,MAX (InfoID) AS [InfoID] 
  /*,[Gender]*/

  FROM [dbo].[Plimplan] as Plimpl
   INNER JOIN [dbo].[Order] as Ord
  ON Plimpl.CaseID = Ord.CaseID 

  WHERE [InfoID] NOT LIKE 'BBBBB%'
  and Plimpl.CaseID < 700
  and Plimpl.CaseID > 600
  GROUP BY Plimpl.CaseID
  order by Plimpl.CaseID desc

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多