不明确的列名称 SQL

Ambiguous column name SQL

当我想执行 SQL 查询时出现以下错误:
“消息 209,级别 16,状态 1,第 9 行 不明确的列名称 'i_id'。”

这是我要执行的 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

这是我的 table 的样子:

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 行时,我确实得到了重复的行,如您所见:

您在 GROUP BY i_id 中忘记了 table 别名。

无论如何,您为什么要编写一个反连接查询来尝试删除 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。 )

我正在添加另一个答案,以显示您通常如何 select 每组的最新记录而不会重复。您为此使用 ROW_NUMBER,将每个 i_id 的最后一条记录标记为行号 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;

(如果您想要重复,您可以使用 RANKDENSE_RANK 而不是 ROW_NUMBER。)