不明确的列名称 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 别名。
无论如何,您为什么要编写一个反连接查询来尝试删除 DISTINCT
和 GROUP 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;
(如果您想要重复,您可以使用 RANK
或 DENSE_RANK
而不是 ROW_NUMBER
。)
当我想执行 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 别名。
无论如何,您为什么要编写一个反连接查询来尝试删除 DISTINCT
和 GROUP 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;
(如果您想要重复,您可以使用 RANK
或 DENSE_RANK
而不是 ROW_NUMBER
。)