как мне получить несколько записей из 1 записи

#sql #sql-server #sql-server-2005

#sql #sql-сервер #sql-server-2005

Вопрос:

У меня есть таблица продуктов с 15 полями, такими как ItemID (primary),Name ,UPC,Price,Cost, etc.

Теперь мне нужно напечатать метки, которые пользователь может сказать

  • из элемента «ABC» мне нужно 15 меток
  • из элемента ‘XYZ» Мне нужно 10 меток

Мне нужна инструкция SQL, в которую я отправлю ItemId и количество меток для каждой записи, и она должна вернуть мне для каждой метки запись, например, 15 записей для элемента «ABC» и 10 записей для элемента «XYZ» и так далее

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

1. Почему вы не можете просто создать необходимое количество меток в своем коде вместо этого?

2. @Lasse — сделайте это ответом, и я поддержу его 🙂

3. затем, когда возвращаемся, повторно запускаем true loop, это занимает очень много времени, мы выделяем из таблицы 100 000 записей

Ответ №1:

 SELECT <fields>
FROM Mytable
Where Item = 'ABC'
GO 10
  

Выберет эти поля из этой таблицы 10 раз подряд в 10 наборах результатов.

На самом деле, хотя это звучит так, как будто вам нужно делать то, что вы пытаетесь сделать, не в SQL, а в вашем вызывающем приложении.

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

1. Отлично, я никогда не знал, что это возможно, но я думаю, что это будет работать только в Management Studio, не так ли?

2. @lieven — правильно. Либо он не использует приложение, и он делает это через SSMS, либо он использует приложение, и оно должно обрабатывать повторение.

3. @Nathan — тогда вы должны использовать свое приложение, а не SQL для этого.

Ответ №2:

Я согласен, что это должно быть сделано на клиенте, но если вы настаиваете, following дублирует каждую запись 100 раз и выбирает из нее нужное вам количество.

 ;WITH ATable AS (
  SELECT Item = 'ABC'
  UNION ALL SELECT Item = 'XYZ'
)
, Temp (Item, Amount) AS (
  SELECT 'ABC', 15
  UNION ALL SELECT 'XYZ', 10
)
, q AS (
  SELECT  ID = 1
          , Item
  FROM    ATable
  UNION ALL
  SELECT  ID = q.ID  1
          , q.Item
  FROM    q
  WHERE   ID < 100         
)
SELECT  q.*
FROM    q
        INNER JOIN Temp t ON t.Item = q.Item
                             AND t.Amount >= q.ID
  

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

1. @JNK, спасибо, но в зависимости от количества строк с возможным серьезным снижением производительности.

2. спасибо, но как можно отправить на сервер, потому что я не знаю, какой элемент выберет пользователь

3. @Nathan, вы должны в какой-то момент знать, сколько ABC и XYZ вам нужно, прежде чем отправлять запрос на сервер, не так ли?

4. я думаю создать временную таблицу с ItemId и qty, но как затем вернуть ее оттуда

5. @Nathan, если вы можете создать эту временную таблицу, вы также должны иметь возможность создавать инструкцию sql. Единственной переменной является предложение where (и вам не нужен синтаксис WITH ATable). Я отредактировал ответ, чтобы отразить, какой запрос должен быть отправлен на сервер.

Ответ №3:

Вы создаете динамическую таблицу с псевдонимом r, указанным ниже. Работает для сумм до 2047.

 select t.*
from 
 (select label='ABC', required=15 union all
  select label='XYZ', required=10) r
inner join tbl t
    on t.ItemID = r.label
inner join master..spt_values v
    on v.type=Number and v.number between 1 and r.required
order by t.ItemID