Как получить запись с одним вхождением несколько раз, используя инструкцию IN в SQL?

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть один мастер ItemMaster главной таблицы. Он содержит все уникальные записи. У меня есть другая таблица ItemOrder, в которой элементы имеют несколько вхождений. Теперь я хочу получать один и тот же элемент столько раз, сколько я вызываю его в инструкции IN (идентификаторы элементов автоматически генерируются кодом).

Пример —

Столбцы ItemMaster — ItemId, ItemCode, ItemName, Description и т. Д…

Столбцы ItemOrder — ItemId, ItemFinish и т.д…

Я использую —

 SELECT ItemId, ItemCode FROM ItemMaster WHERE ItemId IN (10, 20, 30, 40, 10, 50, 20,...);
 

Я хочу, чтобы результирующий набор дважды содержал элемент # 10 ИЛИ 20. Этот оператор IN генерируется автоматически. Элементы одинаковы, но отличаются в зависимости от их завершения!

Буду признателен. Спасибо!

Комментарии:

1. Выполните соединение вместо IN .

2. Не могли бы вы указать или дать код?

3. Вы не можете ПРОСТО использовать in; это только сейчас, как работает «In».. In просто возвращает все значения В списке независимо от того, сколько раз это происходит. Допустим, в ваших данных содержится 7 «20». Какие 2 из 7 «20-х» вы бы хотели? Перекрестное применение и top можно использовать для ограничения всех записей, возвращаемых для каждого элемента, не более чем максимальным; курсор можно использовать для анализа каждого по отдельности и перебора каждого значения вместо использования In . Но, насколько мне известно, вы не можете ограничить возвращаемые записи количеством вхождений значения в инструкции In.

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

5. Пожалуйста, посетите anchulgupta.com/sql.PNG . Результирующий набор показывает единичные вхождения, скажем, 45, тогда как я хочу, чтобы он появлялся дважды.

Ответ №1:

Вы можете использовать join :

 SELECT v.ItemId, m.ItemCode
FROM (VALUES (10), (20), (30), (40), (20), . . .
     ) v(ItemId) JOIN
     ItemMaster im
     ON im.ItemId = v.ItemId;
 

Примечание: если вы также хотите сохранить несоответствие itemids , тогда используйте LEFT JOIN .

Комментарии:

1. Может быть, я что-то упускаю: но я думаю, что он после ограничения данных возвращает идентификатор элемента «20» только дважды из ItemOrder (среди других значений в in). Я itemOrder здесь вообще ничего не вижу. и только дважды, даже если в нем 5 вхождений «20», поскольку в In инструкции только 20 перечислены дважды. Я был заинтригован, хотя я думал, что изучаю что-то новое; и, возможно, я все еще собираюсь! : P ~~

2. Таблица ItemOrder содержит несколько заказов разных клиентов. Клиент может заказать один и тот же товар дважды или трижды и т. Д. На основе разных цветов отделки. Итак, это сценарий. Вы также можете предложить любой другой запрос. У меня просто есть серия ItemId, возвращенных из кода.