2017-04-06 55 views
0

当我想要执行SQL查询时出现以下错误:
“Msg 209,Level 16,State 1,Line 9 歧义列名'i_id'。”不明确的列名SQL

这是SQL查询我要执行:

SELECT DISTINCT x.* 
FROM items x LEFT JOIN items y 
ON y.i_id = x.i_id 
AND x.last_seen < y.last_seen 
WHERE x.last_seen > '4-4-2017 10:54:11' 
AND x.spot = 'spot773' 
AND (x.technology = 'Bluetooth LE' OR x.technology = 'EPC Gen2') 
AND y.id IS NULL 
GROUP BY i_id 

这是我的表看起来像:

CREATE TABLE [dbo].[items] (
[id]   INT   IDENTITY (1, 1) NOT NULL, 
[i_id]  VARCHAR (100) NOT NULL, 
[last_seen] DATETIME2 (0) NOT NULL, 
[location] VARCHAR (200) NOT NULL, 
[code_hex] VARCHAR (100) NOT NULL, 
[technology] VARCHAR (100) NOT NULL, 
[url]  VARCHAR (100) NOT NULL, 
[spot]  VARCHAR (200) NOT NULL, 
PRIMARY KEY CLUSTERED ([id] ASC)); 

我试了几件事情,但我不是一个SQL专家:)
任何帮助,将不胜感激

编辑:

我得到重复的行,当我删除GROUP BY行,你可以看到: enter image description here

+4

你需要指定表在你的小组里。 “GROUP BY x.i_id” –

+2

你错过了通过 –

+2

'GROUP BY PUT_X_OR_Y_HERE.i_id'组中的别名 - 这是因为有在x和y的i_id和服务器不知道你要组哪一个通过。 –

回答

1

我加入另一回答为了向您展示了通常如何选择每个组的最新的记录没有得到重复。您的使用ROW_NUMBER为此,标志着行号为1

SELECT * 
FROM 
(
    SELECT 
    i.*, 
    ROW_NUMBER() over (PARTITION BY i_id ORDER BY last_seen DESC) as rn 
    FROM items i 
    WHERE last_seen > '2017-04-04 10:54:11' 
    AND spot = 'spot773' 
    AND technology IN ('Bluetooth LE', 'EPC Gen2') 
) ranked 
WHERE rn = 1; 

每i_id每一个最后的记录(你会使用RANKDENSE_RANK,而不是ROW_NUMBER,如果你想重复。)

1

你忘了表的别名在GROUP BY i_id

无论如何,你为什么要写一个反连接查询,你试图摆脱DISTINCTGROUP BY这两个重复?你有一个直接的NOT EXISTS查询问题?你正在使事情变得比实际情况复杂。

SELECT * 
FROM items i 
WHERE last_seen > '2017-04-04 10:54:11' 
AND spot = 'spot773' 
AND technology IN ('Bluetooth LE', 'EPC Gen2') 
AND NOT EXISTS 
(
    SELECT * 
    FROM items other 
    WHERE i.i_id = other.i_id 
    AND i.last_seen < other.last_seen 
); 

(当然也有每i_id得到最后看到记录的其他技术这是一个;另外一种是与MAX(last_seen)对比;另一种是使用ROW_NUMBER。)

+0

谢谢你的评论,但我仍然得到重复行? (看我的文章中的图片) –

+1

你在图片中突出显示的行不是重复**;他们有不同的ID。所以你必须定义你所称的重复。然后,您可以决定只选择有问题的列(i_id,last_seen,location,...),而不使用ID并使用“DISTINCT”。或者您决定显示其中一个ID(例如最大的一个)。您可以选择列加'max(id)'然后按除ID以外的所有列进行分组。 –

+0

是的,我非常感谢你! :) –