Greg0364 Ответов: 2

Как писать этого оператора выбрать


У меня есть таблица с некоторыми данными и двумя ключами. Не лишним ключ1, Ключ2 нуль в состоянии
Комбинация Клавиш1 и Key2 должна быть уникальной для каждой строки. Мне нужно написать оператор select, который для каждого заданного key2 возвращает данные из таблицы, соответствующей Key2 или где Key2 равен нулю без дубликатов key1. Таким образом, если у меня есть две строки с одним и тем же ключом Key1, и одна из них имеет ключ Key2, а другая, где ключ key2 равен нулю, я должен возвращать только строку с соответствующим ключом KEY2. Строка, где key2 равен нулю, может существовать, а может и не существовать, то же самое относится и к строкам, где key2 не равен нулю
Вот вам пример:
Data	Key1	Key2
A	1	1
B	1	NULL
C	1	2
D	2	NULL
E	3	1
Результат для ключа 2=1
Data	Key1	Key2
A	1	1
D	2	NULL
E	3	1
Результат для ключ2 = 2
Data	Key1	Key2
C	1	2
D	2	NUL

Результат для ключа 2 =3
Data	Key1	Key2
B	1	NULL
D	2	NULL

Он должен быть в одном операторе select, который будет использоваться внутри пользовательской функции, принимающей kye2 в качестве параметра

Что я уже пробовал:

Я пробовал несколько утверждений, но все терпят неудачу в одном из случаев
Буду признателен за помощь в этом вопросе

2 Ответов

Рейтинг:
15

CHill60

Я разбил это на две части
1 - все, где колонка key2 соответствует параметру
2 - Все, что угодно (обратите внимание на изменение формулировки), где столбец key2 является нулем и столбцом key1 не появляется в результатах от 1 выше

Затем я преобразовал это в два общих табличных выражения и объединил результаты:

;with CTE1 AS
(
	SELECT 'CTE1' AS SOURCE, *
	FROM @tmp WHERE Key2 = @key
)
, CTE2 AS
(
	SELECT 'CTE2' AS SOURCE, *
	FROM @tmp WHERE Key2 IS NULL
	AND Key1 NOT IN (SELECT Key1 FROM CTE1)
)
SELECT * FROM CTE1 UNION SELECT * FROM CTE2
ORDER BY [Data]
Я включил в него SOURCE колонка просто для ясности о том, откуда на самом деле исходили данные - вы должны удалить ее.

С точки зрения настройки этого как функции мой @key будет параметром для этой функции. Вот некоторые инструкции о том, как настроить функцию, если вы с ней не знакомы - Таблично-значная функция SQL Server на практических примерах[^]

Наконец, вот тестовые данные, которые я использовал, на случай, если мне нужно будет вернуться к этому вопросу :-)
declare @tmp table ([Data] varchar(10),	Key1 int, Key2 int)
insert into @tmp ([Data], Key1, Key2) values
('A',1,	1), ('B',1,	NULL), ('C',1,	2), ('D',2,	NULL), ('E',3,	1)

declare @key int 

set @key = 3


Greg0364

Работа по мере необходимости
Большое спасибо.

CHill60

Отличная новость!

Рейтинг:
1

Christian Graus

Что делать, если вы сгруппируете по ключу 1, а затем закажете по ключу 2 desc и выберете верхний из каждого набора?


Greg0364

Группировка не будет работать, так как мне также нужно возвращать данные, которые могут быть разными для каждой строки

Christian Graus

Но вам нужно одно значение для каждого key1, либо нулевое значение, либо значение, которое не является нулевым? Или вы говорите, что может быть много значений key2, и вы хотите их все, или только нулевое значение, если это все, что существует?