SQL分组显示
我有一个项目表,所有项目都标记了相关客户端的查找,并希望显示如下数据: 客户1 项目1 项目2 项目3 客户2 项目1 项目2 客户3 项目1 项目2 项目3 这样,我就可以从表中取回项目,并按客户对它们进行分组。SQL分组显示,sql,Sql,我有一个项目表,所有项目都标记了相关客户端的查找,并希望显示如下数据: 客户1 项目1 项目2 项目3 客户2 项目1 项目2 客户3 项目1 项目2 项目3 这样,我就可以从表中取回项目,并按客户对它们进行分组。 你把这种行为称为什么?它是嵌套组还是类似的东西?SQL查询无法提供嵌套结果,因为您已经布置了1。相反,结果集必须是平面的,重复客户端多次,每个项目一次。实际上,在SQL查询中,将类似的客户机值排序在一起只是一个排序问题:按客户机排序 然后,在应用程序显示逻辑中,仅当值与前一个值不同时
你把这种行为称为什么?它是嵌套组还是类似的东西?SQL查询无法提供嵌套结果,因为您已经布置了1。相反,结果集必须是平面的,重复客户端多次,每个项目一次。实际上,在SQL查询中,将类似的客户机值排序在一起只是一个排序问题:按客户机排序 然后,在应用程序显示逻辑中,仅当值与前一个值不同时才打印新客户端 伪代码:
1它可以在SQL中通过大量疯狂的字符串操作和联合来完成,但这是一个表示问题,真正属于应用程序表示逻辑,而不是SQL。SQL查询无法提供如您所述的嵌套结果1。相反,结果集必须是平面的,重复客户端多次,每个项目一次。实际上,在SQL查询中,将类似的客户机值排序在一起只是一个排序问题:按客户机排序 然后,在应用程序显示逻辑中,仅当值与前一个值不同时才打印新客户端 伪代码:
1它可以在SQL中通过大量疯狂的字符串操作和联合来完成,但这是一个表示问题,真正属于应用程序表示逻辑而不是SQL。如果您的RDBMS(未在标记中指定)支持递归SQL,则您可以近似于您尝试完成的布局 以下SQL适用于Teradata的数据字典表。“层次结构”列根据数据库在所有权链中的深度进行偏移。从那以后,你应该能够接受这个概念并将其应用到你的情况中
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;
如果您的RDBMS(标记中未指定)支持递归SQL,则可以近似于您试图完成的布局 以下SQL适用于Teradata的数据字典表。“层次结构”列根据数据库在所有权链中的深度进行偏移。从那以后,你应该能够接受这个概念并将其应用到你的情况中
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;
非常感谢。我不确定这是在SQL中还是在应用程序逻辑本身中完成的,但直到我知道我不得不问。谢谢你的详细回答,真的很有帮助!非常感谢。我不确定这是在SQL中还是在应用程序逻辑本身中完成的,但直到我知道我不得不问。谢谢你的详细回答,真的很有帮助!
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;