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