Вопрос:

SQL Повтор строки первичного ключа в операторе выбора без использования функции объединения всех

sql sql-server sql-server-2016

46 просмотра

3 ответа

13 Репутация автора

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

Предположим, у меня есть таблица сотрудников с двумя столбцами: (emp_id (primary key), emp_name);

emp_id   name
 1       abc 
 2       xy
 3       xyz

И предположим, что я выбираю записи из таблицы emp, как.

Select * from emp where emp_id in (1,2,2,3);

Три строки будут возвращены из таблицы.
Вместо трех я хочу получить 4 строки из таблицы.

Запрос также должен работать для других входных данных, таких как:

Select * from emp where emp_id in (1,1,1,2,2,3,3,3,3);

в то же время я должен вернуть 9 строк из таблицы.

Я уже пытался с union allфункцией, чтобы получить записи.
Но union allбудет статичным решением.

Автор: Jaypal Sodha Источник Размещён: 11.08.2019 06:22

Ответы (3)


0 плюса

38400 Репутация автора

Решение

Создайте набор данных с помощью VALUESи присоедините его к таблице:

with cte as (
  select * from
  (values (1),(1),(1),(2),(2),(3),(3),(3),(3)) as t(id)
)
select e.* 
from cte c inner join emp e
on e.emp_id = c.id

Смотрите демо .
Результаты:

> emp_id | name
> -----: | :---
>      1 | abc 
>      1 | abc 
>      1 | abc 
>      2 | xy  
>      2 | xy  
>      3 | xyz 
>      3 | xyz 
>      3 | xyz 
>      3 | xyz 
Автор: forpas Размещён: 11.08.2019 07:11

0 плюса

4516 Репутация автора

Вы также можете попробовать это, так как упомянули, что используете SQL Server версии 2016 (требуется уровень совместимости 130) -

SELECT * FROM
(
    SELECT value 
    FROM STRING_SPLIT('1,2,2,3', ',')
)A
LEFT JOIN your_table B ON A.value = B.emp_id

Вы можете проверить ДЕМО ЗДЕСЬ

Автор: mkRabbani Размещён: 11.08.2019 08:26

0 плюса

843535 Репутация автора

Если вы хотите гарантировать порядок набора результатов, вам необходимо включить эту информацию в value()предложение:

select v.id, e.* 
from (values (1, 1), (2, 1), (3, 1), (4, 2),
             (5, 2), (6, 3), (7, 3), (8, 3), (9, 3)
     ) v(ord, id) left join
     emp e
     on e.emp_id = v.id
order by v.ord;

Заметки:

  • Вам не нужно подзапрос или CTE для предложения значений. Это кажется излишним.
  • В left joinгарантирует , что точные строки находятся в наборе результатов , даже если нет совпадений . По этой причине он включает идентификатор из производной таблицы.
  • Это order byнеобходимо для гарантии заказа.
Автор: Gordon Linoff Размещён: 11.08.2019 11:48
Вопросы из категории :
32x32