我有一个项目表,所有项目都标有相关客户的查找标签,并希望显示如下数据:
- 客户 1
- 项目一
- 项目 2
- 项目 3
- 客户 2
- 项目一
- 项目 2
- 客户 3
- 项目一
- 项目 2
- 项目 3
这样我就可以从我的桌子上取回项目,并让它们按客户“分组”。你怎么称呼这个动作?是嵌套组还是类似的东西?
我有一个项目表,所有项目都标有相关客户的查找标签,并希望显示如下数据:
这样我就可以从我的桌子上取回项目,并让它们按客户“分组”。你怎么称呼这个动作?是嵌套组还是类似的东西?
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。
如果您的 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;