Неоднозначное имя столбца 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
Вот так выглядит мой стол:
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, как вы можете видеть:
2 ответа
Я добавляю еще один ответ, чтобы показать, как вы обычно выбираете последнюю запись на группу без дублирования. Вы используете 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
если вы хотели дубликаты.)
Вы забыли псевдоним таблицы в GROUP BY i_id
,
В любом случае, почему вы пишете анти-объединяющий запрос, где вы пытаетесь избавиться от дубликатов с обоими 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
.)