2017-04-06 95 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

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