Не удается получить четкие результаты при объединении таблиц - PullRequest
0 голосов
/ 28 ноября 2018

У меня проблема, похожая на SELECT DISTINCT, на которой по-прежнему отображаются дубликаты

Теперь я понимаю, что DISTINCT применяется ко всей строке, поэтому в результате получается то, что должно,Я пытаюсь вернуть следующие строки, но я не хочу повторяющихся серийных номеров.Если есть дубликаты, я хотел бы просто взять последнюю запись.

Вот мой запрос:

USE [db1]
SELECT DISTINCT Serial.[Serial Number], Plugin.[Plugin Name] AS [Model], Revision.Revision AS [Firmware Revision], ConnectionType.[Connection Type] As [Connection]
FROM Station
JOIN Plugin ON Station.[Plugin ID] = Plugin.[Plugin ID]
JOIN Serial ON Station.[Serial ID] = Serial.[Serial ID]
JOIN Revision ON Station.[Revision ID] = Revision.[Revision ID]
JOIN Connection ON Station.[Connection ID] = Connection.[Connection ID]
JOIN ConnectionType On Connection.[Connection Type ID] = ConnectionType.[Connection Type ID]
WHERE Station.[MAC Address ID] = (select MAC.[MAC Address ID] from MAC where mac.[MAC Address] = '123456')
ORDER BY Serial.[Serial Number] DESC

Вот результат:

enter image description here

Итак, вы можете видеть, что есть две записи для X12132, потому что микропрограмма в этом устройстве была обновлена ​​в какой-то момент, и DISTINCT был применен ко всей строке, но, к сожалению, приводит к дублированию серийных номеров.Что я должен сделать, чтобы решить эту проблему?

Я пытался сделать GROUP BY Serial.[Serial Number], но он дает мне следующую ошибку:

Msg 8120, Уровень 16, Состояние 1,Столбец строки 2 «Plugin.Plugin Name» недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.Сообщение 145, Уровень 15, Состояние 1, Строка 2 Элементы ORDER BY должны отображаться в списке выбора, если указано SELECT DISTINCT.

У меня такое ощущение, что, возможно, это как-то связано с моими объединениями,но я не смог понять это.Пожалуйста, дайте мне знать, если вам нужна дополнительная информация о других таблицах.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

У вас, похоже, есть две версии прошивки для X12132.Вы выбираете максимальную версию прошивки и группируете по другим столбцам:

SELECT
    Serial.[Serial Number],
    Plugin.[Plugin Name] AS [Model], 
    MAX(Revision.Revision) AS [Firmware Revision], 
    ConnectionType.[Connection Type] As [Connection]
FROM ...
GROUP BY Serial.[Serial Number], Plugin.[Plugin Name] AS [Model], ConnectionType.[Connection Type]
0 голосов
/ 28 ноября 2018
USE [db1]
SELECT DISTINCT Serial.[Serial Number], Plugin.[Plugin Name] AS [Model], Revision.Revision AS [Firmware Revision], ConnectionType.[Connection Type] As [Connection]
FROM Station
JOIN Plugin ON Station.[Plugin ID] = Plugin.[Plugin ID]
JOIN Serial ON Station.[Serial ID] = Serial.[Serial ID]
JOIN Revision ON Station.[Revision ID] = Revision.[Revision ID]
JOIN Connection ON Station.[Connection ID] = Connection.[Connection ID]
JOIN ConnectionType On Connection.[Connection Type ID] = ConnectionType.[Connection Type ID]
WHERE Station.[MAC Address ID] = (select MAC.[MAC Address ID] from MAC where mac.[MAC Address] = '123456')
gorup by Serial.[Serial Number],Plugin.[Plugin Name],Revision.Revision, ConnectionType.[Connection Type]
ORDER BY Serial.[Serial Number] DESC
0 голосов
/ 28 ноября 2018

Самый простой способ получить то, что вы хотите с помощью этого запроса, это использовать row_number() в order by:

SELECT TOP (1) WITH TIES Serial.[Serial Number], Plugin.[Plugin Name] AS [Model], Revision.Revision AS [Firmware Revision], ConnectionType.[Connection Type] As [Connection]
FROM Station
JOIN Plugin ON Station.[Plugin ID] = Plugin.[Plugin ID]
JOIN Serial ON Station.[Serial ID] = Serial.[Serial ID]
JOIN Revision ON Station.[Revision ID] = Revision.[Revision ID]
JOIN Connection ON Station.[Connection ID] = Connection.[Connection ID]
JOIN ConnectionType On Connection.[Connection Type ID] = ConnectionType.[Connection Type ID]
WHERE Station.[MAC Address ID] = (select MAC.[MAC Address ID] from MAC where mac.[MAC Address] = '123456')
ORDER BY ROW_NUMBER() OVER (PARTITION BY Serial.[Serial Number] ORDER BY ? DESC);

Я не знаю, как вы определяете "последнюю запись", поэтому ORDER BY ? для столбца, который определяет порядок.

...