2016-12-15 4 views
0

Я сравниваю две таблицы (dbo.new и dbo.old), и если совпадение первых трех столбцов и четвертый столбец совпадают, он должен выбрать его. Теперь это показывает много значений, и я хочу показать только уникальные значения column2. Это код, у меня сейчас:Как показать только уникальные значения в этом существующем SQL-запросе

SELECT dbo.new.[column1], dbo.new.[column2], dbo.new.[column3], dbo.new.[column4] 
FROM dbo.new 
JOIN dbo.old ON dbo.new.[column1]=dbo.old.[column1] 
    AND dbo.new.[column2]=dbo.old.[column2] 
    AND dbo.new.[column3]=dbo.old.[column3] 
WHERE [dbo].[new].[column4] <> [dbo].[old].[column4] 

Первые две таблицы я начинаю с:

----------------- 
| 1 | 1 | 1 | 1 | 
----------------- 
| 2 | 1 | 2 | 2 | 
----------------- 
| 3 | 3 | 3 | 3 | 
----------------- 
| 4 | 1 | 4 | 4 | 
----------------- 

----------------- 
| 1 | 1 | 1 | 9 | 
----------------- 
| 2 | 1 | 2 | 9 | 
----------------- 
| 3 | 3 | 3 | 9 | 
----------------- 
| 4 | 1 | 4 | 9 | 
----------------- 

Это результат вышеупомянутого запроса:

----------------- 
| 1 | 1 | 1 | 1 | 
----------------- 
| 2 | 1 | 2 | 2 | 
----------------- 
| 3 | 3 | 3 | 3 | 
----------------- 
| 4 | 1 | 4 | 4 | 
----------------- 
    ^delete those duplicates 

Это то, что я хочу чтобы быть результатом:

----------------- 
| 1 | 1 | 1 | 1 | 
----------------- 
| 3 | 3 | 3 | 3 | 
----------------- 

Я пробовал многие вещи, такие как UNIQUE и DISTINCT, но я не могу найти решение. Достаточно даже показать первое значение, если оно показывает одну строку с уникальным номером. Так что это правильно тоже:

----------------- 
| 4 | 1 | 4 | 4 | 
----------------- 
| 3 | 3 | 3 | 3 | 
----------------- 
+1

Редактировать свой вопрос и предоставить образцы данных, а также желаемые результаты. –

+0

@wouterdejong Вам нужны записи со всеми столбцами как одинаковое значение? И добавьте некоторые примеры данных, чтобы было легко понять эту проблему. –

+0

вы сказали: «Если совпадают первые три столбца и четвертый столбец, он должен выбрать его». для меня это означало бы, что будет выбрано 1 1 1 5. 1 1 1 1 или 1 1 5 2 - примеры, которые не были бы выбраны - в первом условии, что четвертое не соответствует, проверено, а во вторых столбцах 1-3 не совпадают - вы могли бы уточнить. – Cato

ответ

1

Похоже, вы заинтересованы только в колонке 2, так что давайте начнем с только выбрать, что. Затем добавьте просто: GROUP BY в конце, и все готово.

SELECT N.[column2] as myvalue 
FROM dbo.new N 
JOIN dbo.old O 
ON N.[column1]=O.[column1] 
    AND N.[column2]=O.[column2] 
    AND N.[column3]=O.[column3] 
WHERE N.[column4] <> O.[column4] 
GROUP BY N.[column2] 
+0

Я получаю ту же ошибку здесь, что и с кодом @Serg: 'Дополнительная информация: идентификатор с несколькими частями «dbo.new.column2» не может быть связан. ' –

+0

@wouterdejong Я сделал редактирование для группы, попробуйте сейчас. –

+0

Пробовал это, но doenst work –

4

Выберите заказ вам нужно в over(), чтобы получить соответствующие строки.

SELECT TOP(1) WITH TIES 
    dbo.new.[column1], dbo.new.[column2], dbo.new.[column3], dbo.new.[column4] 
FROM dbo.new 
JOIN dbo.old ON dbo.new.[column1]=dbo.old.[column1] 
AND dbo.new.[column2]=dbo.old.[column2] 
AND dbo.new.[column3]=dbo.old.[column3] 
where [dbo].[new].[column4] <> [dbo].[old].[column4] 
ORDER BY row_number() over(partition by dbo.new.[column2] order by dbo.new.[column1]) 

Быстрый демо, работает OK сервер SQL 2014

create table dbo.new(
    column1 int, 
    column2 int, 
    column3 int, 
    column4 int); 
create table dbo.old(
    column1 int, 
    column2 int, 
    column3 int, 
    column4 int); 
insert dbo.new values 
(1 , 1 , 1 , 1), 
(2 , 1 , 2 , 2), 
(3 , 3 , 3 , 3), 
(4 , 1 , 4 , 4); 

insert dbo.old values 
(1 , 1 , 1 , 9), 
(2 , 1 , 2 , 9), 
(3 , 3 , 3 , 9), 
(4 , 1 , 4 , 9); 


SELECT TOP(1) WITH TIES 
    dbo.new.[column1], dbo.new.[column2], dbo.new.[column3], dbo.new.[column4] 
FROM dbo.new 
JOIN dbo.old ON dbo.new.[column1]=dbo.old.[column1] 
AND dbo.new.[column2]=dbo.old.[column2] 
AND dbo.new.[column3]=dbo.old.[column3] 
where [dbo].[new].[column4] <> [dbo].[old].[column4] 
ORDER BY row_number() over(partition by dbo.new.[column2] order by dbo.new.[column1]); 

Результат является

column1 column2 column3 column4 
    1  1  1  1 
    3  3  3  3 
+0

приятный! Я не знал «со связями» Более классический столбец с «row_number() over (раздел dbo.new. [Column2]) number_column« и «где number_column = 1» –

+0

@serg Спасибо, но по какой-то причине im получает ошибку: '' Дополнительная информация: идентификатор многочастности «dbo.new.column2» не может быть связан. '' –

+0

Просьба представить определения таблиц – Serg