pn46 Ответов: 2

Как исключить одну и ту же комбинацию в таблице в sqlserver2008


У меня есть таблица, где есть определенные комбинации чисел
таблица MyTable:
col1 col2 приоритет
1 2 1
1 3 2
1 4 3
2 3 2
2 4 3
2 1 1
3 6 1
3 5 3
3 1 2
так что ... вперед
И мне нужно исключить комбинацию {(1,2) или (2,1)} и {(1,3) или (3,1)} из моей таблицы
But I am not able to exclude the duplicate combination of the numbers.
Please suggest me a better way to exclude duplicate combinations like 
once (1,2) combination has appeared in mytable, then it should not appear again as (2,1) combination.
How can it be excluded.Please suggest.
Thanks in Advance.

What I have tried:

I have tried using ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY Col1,col3 DESC)

CHill60

Вы хотите сказать, что не хотите вставлять данные в свою таблицу, если комбинация col1 / col2 уже существует?

pn46

Привет,
Да, я не хочу снова вставлять те же комбинационные данные столбца в таблицу, так как после того, как таблица уже имеет комбинацию, она не должна снова вставлять дублирующуюся комбинацию.
Пожалуйста, подскажите, как мне избежать таких дубликатов.?

2 Ответов

Рейтинг:
2

NightWizzard

Вы можете добавить столбец в свой запрос, где вы умножаете значения из col1 и col2, тогда использовать OVER PARTITION или DISTINCT получить только те строки, которые не имеют одинакового результата умножения.


pn46

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

NightWizzard

Хорошо, я не предполагал, что встречающиеся значения могут привести к одинаковым результатам из разных значений. В этом случае вы должны использовать любой другой числовой трюк, который приводит к одинаковым результатам, где порядок значений в col1 и col2 не имеет значения. Вы можете использовать вычисляемый столбец, который объединяет 2 значения в varchar, начиная с меньшего значения, и в результате преобразует полученную строку обратно в int. В этом случае порядок значений не имеет значения, и у вас есть уникальное значение для каждой комбинации, которое может быть использовано для отдельного запроса. Пример формулы вычисляемого столбца:
Литой(случай, когда (столбца col1 &ЛТ; столбец col2) потом бросил(col1 и как varchar)) + CAST(col2 как varchar)) ELSE CAST(col2 AS varchar)) + CAST(col1 как varchar)) Как int

Рейтинг:
1

CHill60

Возможно, я слишком упрощаю это, но почему бы просто не запросить комбинацию перед добавлением новой строки?

declare @n1 int = 2
declare @n2 int = 1
declare @p int = 21

IF NOT EXISTS (SELECT 1 FROM MyTable 
	WHERE (col1 = @n1 AND col2 = @n2) 
	   OR (col1 = @n2 AND col2 = @n1))
BEGIN
	INSERT INTO MyTable VALUES (@n1,@n2,@p)
END
ELSE
BEGIN
	UPDATE MyTable SET [priority]=@p
		WHERE (col1 = @n1 AND col2 = @n2) 
	   OR (col1 = @n2 AND col2 = @n1)
	-- I've updated. Don't know what you want to do here
END


pn46

Большое спасибо :)