2

我有一个项目表,所有项目都标有相关客户的查找标签,并希望显示如下数据:

  1. 客户 1
    • 项目一
    • 项目 2
    • 项目 3
  2. 客户 2
    • 项目一
    • 项目 2
  3. 客户 3
    • 项目一
    • 项目 2
    • 项目 3

这样我就可以从我的桌子上取回项目,并让它们按客户“分组”。你怎么称呼这个动作?是嵌套组还是类似的东西?

4

2 回答 2

4

SQL 查询无法提供嵌套结果,因为您已经布置了1。相反,您的结果集必须是平坦的,重复Client多次,每个项目一次。实际上,在您的 SQL 查询中,只需将类似的值排序Client在一起即可:ORDER BY client

Client 1    Project 1
Client 1    Project 2
Client 1    Project 3
Client 2    Project 1
Client 2    Project 2
Client 2    Project 3

然后,在您的应用程序显示逻辑中,您仅Client在值从前一个值更改时打印新值。

伪代码:

# Start with empty last_client
last_client = ""
loop_over_rows

  if last_client is not equal to current_row->client
    print new row->client

  # Print all projects
  print row->project

  # Store the current client to compare on next loop
  last_client = row->client
endloop

1它可以通过大量疯狂的字符串操作在 SQL 中完成UNION,但这是一个表示问题,并且真正属于应用程序表示逻辑而不是 SQL。

于 2012-08-16T20:57:57.567 回答
0

如果您的 RDBMS(未在您的标签中指定)支持递归 SQL,则您可以近似您尝试完成的布局。

以下 SQL 适用于 Teradata 的数据字典表。Hierarchy 列根据所有权链中数据库的深度进行偏移。从那里你应该能够接受这个概念并将其应用于你的情况。

WITH RECURSIVE cte (DatabaseName, Path, Parent, Level) AS
 (
  SELECT TRIM(DatabaseName)
         ,DatabaseName(VARCHAR(600))
         ,TRIM(DatabaseName)
         ,0 (BYTEINT)
  FROM   DBC.Databases d
  WHERE  DatabaseName = 'DBC'

  UNION ALL

  SELECT TRIM(d.DatabaseName)
         ,cte.Path || '.' || TRIM(d.DatabaseName)
         ,cte.Path
         ,Level + 1
  FROM   DBC.Databases d
         ,cte
  WHERE  d.OwnerName = cte.DatabaseName
  AND    d.DatabaseName <> d.OwnerName
  AND    Level < 20
 )
SELECT Level
     , SUBSTRING(CAST('' AS CHAR(60)) FROM 1 FOR Level * 2)  || DatabaseName AS Hierarchy
     , Path
     , Parent
FROM   cte
ORDER BY Path;
于 2012-08-16T21:25:03.057 回答