【问题标题】:how do i get multiple records from 1 record如何从 1 条记录中获取多条记录
【发布时间】:2011-04-14 19:42:00
【问题描述】:

我有一个包含 15 个字段的产品表,例如 ItemID (primary),Name ,UPC,Price,Cost, etc.

现在我需要打印用户可以说的标签

  • 从项目“ABC”我需要 15 个标签
  • 从项目“XYZ”我需要 10 个标签

我需要一条 SQL 语句,我将为每个记录发送 ItemID 和标签 Qty,它应该为每个标签返回一条记录,例如项目“ABC”的 15 条记录和项目“XYZ”的 10 条记录和以此类推

【问题讨论】:

  • 为什么不能简单地在代码中生成必要数量的标签?
  • @Lasse - 回答这个问题,我会投赞成票的 :)
  • 那么当返回时重新运行真正的循环,我们需要很长时间才能从表中找到 100,000 条记录

标签: sql sql-server sql-server-2005


【解决方案1】:
SELECT <fields>
FROM Mytable
Where Item = 'ABC'
GO 10

将在 10 个结果集中连续 10 次从该表中选择这些字段。

确实,虽然听起来您需要做的事情不是在 SQL 中,而是在您的调用应用程序中。

【讨论】:

  • 很好,我从来不知道这是可能的,但我认为这只会在 Management Studio 中有效,不是吗?
  • @lieven - 正确。要么他没有使用应用程序,而是通过 SSMS 执行此操作,要么他正在使用应用程序,它应该处理重复。
  • @Nathan - 那么你应该使用你的应用程序而不是 SQL。
【解决方案2】:

我同意这应该在客户端上完成,但如果您坚持,请重复每条记录 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

【讨论】:

  • @JNK,谢谢,但取决于可能严重影响性能的行数。
  • 谢谢,但是如何发送到服务器,因为我不知道用户会选择哪个项目
  • @Nathan,在将查询发送到服务器之前,您必须知道在某个时候需要多少个 ABC 和 XYZ,不是吗?
  • 我想用 itemID 和 qty 创建一个临时表,但是如何从那里返回
  • @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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多