该列已多次指定

时间:2017-10-20 08:12:03

标签: sql-server sql-server-2012

我在使用以下sql查询时出错。它说

  

"列'类型'被多次指定为' M'"。

' M'之后

(SELECT * FROM [ToolManagement].[dbo].[tblTools] K JOIN [ToolManagement].[dbo].[tblToolTypes] L ON K.ToolType = L.ToolType)

在sql management studio中加下划线。

    SELECT          A.EntryID, A.Time, B.Name, B.Number, C.Number, D.StationNr, E.Number, E.Pressure, F.Nickname, F.Number, G.Format, G.Format, G.ID2, H.Description, I.Comment, M.Description
    FROM            [...]   A
    JOIN            [...]   B ON A.EntryID = B.EntryID
    JOIN            [...]   C ON A.EntryID = C.EntryID
    JOIN            [...]   D ON A.EntryID = D.EntryID
    JOIN            [...]   E ON A.EntryID = E.EntryID
    JOIN            [...]   F ON A.EntryID = F.EntryID
    JOIN            [...]   G ON A.EntryID = G.EntryID
    JOIN            [...]   H ON A.EntryType = H.EntryType
    LEFT OUTER JOIN [...]   I ON A.EntryID = I.EntryID
    JOIN            (SELECT * FROM [...] K JOIN [...] L ON K.Type = L.Type) M ON A.ID = M.ID
    WHERE           A.ID = '1234'

2 个答案:

答案 0 :(得分:2)

问题是您的内部查询是从K和L中选择type列。看到您的内部查询选择每个表中的每一列,因此结果中会有2 type列;来自K的1和来自L的一个。您需要确保只返回一个名为type的列,或者另一列的别名具有不同的名称。

SELECT * FROM [...] K JOIN [...] L ON K.Type = L.Type

K.TypeM.Type都将作为M.type返回,因此您的外部查询无法确定返回哪两个。如果Type是您在该子查询中实际需要的唯一列,则只需返回K.type

SELECT K.Type FROM [...] K JOIN [...] L ON K.Type = L.Type

答案 1 :(得分:1)

这里的问题是,在子查询中,您将M别名为SELECT *,并且连接中涉及的两个表都有一个Type列。 SQL Server理所当然地抱怨它不知道您要选择哪个Type列。

您只使用子查询中的单个类型列,并且连接条件确保两者都相同,因此只需选择其中一个:

SELECT
    A.EntryID, A.Time, B.Name, B.Number, C.Number, D.StationNr, E.Number,
    E.Pressure, F.Nickname, F.Number, G.Format, G.Format, G.ID2, M.Description,
    I.Comment, M.Type
FROM            [...]   A
JOIN            [...]   B ON A.EntryID = B.EntryID
JOIN            [...]   C ON A.EntryID = C.EntryID
JOIN            [...]   D ON A.EntryID = D.EntryID
JOIN            [...]   E ON A.EntryID = E.EntryID
JOIN            [...]   F ON A.EntryID = F.EntryID
JOIN            [...]   G ON A.EntryID = G.EntryID
JOIN            [...]   H ON A.EntryType = H.EntryType
LEFT OUTER JOIN [...]   I ON A.EntryID = I.EntryID
JOIN            (SELECT L.Type, L.Description FROM [...] K JOIN [...] L
                     ON K.Type = L.Type) M ON A.ID = M.ID
WHERE           A.ID = '1234'

请注意,顶级的select语句当然可以包含两个或多个具有相同名称的列/别名。只有在尝试从这样的表中进行选择时才会出现问题。