#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