Объединение таблиц на основе максимального идентификатора - PullRequest
0 голосов
/ 15 ноября 2018

Я нашел три вопроса, которые, кажется, все задают аналогичный вопрос:

Получение максимального значения из строк и присоединение к другой таблице

Выберите только строки по объединяемым таблицам максимальное значение

Объединение таблиц по максимальному значению

Но у меня возникают трудности с переносомОбдумайте, как именно объединять таблицы, сохраняя только максимальную строку одной из таблиц, когда максимум находится в самом поле id или index.

Я ищу ответы, которые требуют только объединений, потому что это позволит решению работать в инструменте, который генерирует запросы, для которых легко получить соответствующие генерации, хотя подзапросы, вероятно,выполнимо также с немного большим усилием.Я нашел ответ ниже, который представляет особый интерес:

SELECT DISTINCT b.id, b.filename, a1.name
FROM a a1
JOIN b
  ON b.id = a1.id
LEFT JOIN a a2
  ON a2.id = a1.id
  AND a2.rank > a1.rank
WHERE a2.id IS NULL

Однако в моем случае столбец ранжирования также является индексом, например, "id".Я не могу сравнивать на равенство и большее, чем в одно и то же время, потому что они никогда не будут истинными одновременнонесколько столов (3-5 не редкость).Итак, в качестве упрощенного примера моего запроса:

SELECT
    table1.field1, table1.field2, table1.field3,
    table2.field1, table2.field2, table2.field3,
    table3.field1, table3.field2, table3.field3,
    table4.field1, table4.field2, table4.field3
FROM table1
INNER JOIN table2 ON
    table1.field1 = table2.field1
    AND table1.field2 = table2.field2
    AND table2.field3 < 0
INNER JOIN table3 ON
    table2.field1 = table3.field1
    AND table2.field4 = table3.field4
INNER JOIN table4 ON
    table1.field1 = table4.field1
    AND table1.field2 = table4.field2

И что я хочу сделать, это устранить дубликаты в таблице 3, только получая строку с максимальным идентификатором (например, MAX (table3.id)) для каждогоуникальная комбинация всех других полей.То есть приведенный выше запрос возвращает что-то вроде этого:

+-------+-------+-------+---------+
| table1| table2| table4|table3   |
+-------+-------+-------+---------+
|  A    |   A   |   A   | 1,...   |
|  A    |   A   |   A   | 2,...   |
|  A    |   A   |   A   | 3,...   |
|  A    |   A   |   A   | MAX2,...|
|  B    |   B   |   B   | 1,...   |
|  B    |   B   |   B   | 2,...   |
|  B    |   B   |   B   | 3,...   |
|  B    |   B   |   B   | MAX2,...|
+-------+-------+-------+---------+

(я просто использую A и B, чтобы обозначить, что я говорю обо всех одинаковых значениях для полей в таблице1,table2 и table4 для определенного набора строк.)

, и я хочу уменьшить его до этого:

+-------+-------+-------+---------+
| table1| table2| table4|table3   |
+-------+-------+-------+---------+
|  A    |   A   |   A   | MAX1,...|
|  B    |   B   |   B   | MAX2,...|
+-------+-------+-------+---------+

1 Ответ

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

Вы можете добавить производную таблицу, чтобы уменьшить количество совпадающих строк в TABLE3 до одной на группу.Другой метод будет использовать оконную функцию, но вы попросите только JOIN

SELECT
    table1.field1, table1.field2, table1.field3,
    table2.field1, table2.field2, table2.field3,
    table3.field1, table3.field2, table3.field3,
    table4.field1, table4.field2, table4.field3
FROM table1
INNER JOIN table2 ON
    table1.field1 = table2.field1
    AND table1.field2 = table2.field2
    AND table2.field3 < 0
INNER JOIN table3 ON
    table2.field1 = table3.field1
    AND table2.field4 = table3.field4

--here is the added derived table. Change column names as needed
INNER JOIN (select UID, ID = max(ID) from Table3 group by UID) x
    on x.UID = table3.UID and x.mx = table3.ID

INNER JOIN table4 ON
    table1.field1 = table4.field1
    AND table1.field2 = table4.field2

Или, возможно ... что-то вроде ниже.Это действительно зависит от вашей схемы, и это трудно понять на примере данных.

INNER JOIN (select field1, field4, mx = max(ID) from Table3 group by field1, field4) x
    on x.field1 = table3.field1 and x.field4 = table3.field4 and x.mx = table3.ID

Вот пример.Вы заметите, что последние три пары столбцов идентичны.Вы хотите только последний, который является максимальным (id) для этой группировки.То, что делает строку уникальной по отношению к остальным вашим данным (не к первичному ключу, а к тому, с чем вы соединяетесь), - это то, что вы хотели бы включить в производную таблицу и условие соединения.

declare @table table (id int identity(1,1), f1 char(1), f2 char(1))
insert into @table
values
('a','b'),
('a','c'),
('a','a'),
('b','b'),
('b','b'),
('b','b')

select * from @table

select t1.*
from @table t1
inner join 
    (select f1, f2, mx = max(id) from @table group by f1, f2) t2 on
    t1.f1 = t2.f1
    and t1.f2 = t2.f2
    and t1.id = t2.mx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...