Sybase数据库SELECT语句如何实现多分类查询结果并列展示
Sybase实现两类食物并排展示查询结果方案
你最初编写的SQL存在两个核心问题:
- select子句中直接嵌入返回多行结果的子查询,会触发「子查询返回多于一个值」的语法报错
- 没有对水果、蔬菜两类数据做行对齐关联逻辑,无法实现两类值并排输出的效果
实现思路
要得到你期望的展示效果,核心是给两类数据分别生成连续的匹配行号,再通过行号做全外连接对齐行,最后控制ID列仅在第一行展示即可:
- 分别筛选
food_type为fruit、veg的数据集,给每类数据按指定排序生成连续行号 - 用行号作为关联条件做全外连接,保证两类数据不管数量是否一致都能完整展示
- 仅在第一行展示ID值,其余行ID列留空
具体SQL实现
Sybase ASE 15.7及以上版本(支持窗口函数)
直接用row_number()窗口函数生成行号即可,不需要建临时表:
SELECT CASE WHEN f.rn = 1 THEN 1 ELSE NULL END AS ID, f.names AS fruit, v.names AS veg FROM ( SELECT names, ROW_NUMBER() OVER(ORDER BY names) AS rn FROM Food WHERE food_type = 'fruit' ) f FULL OUTER JOIN ( SELECT names, ROW_NUMBER() OVER(ORDER BY names) AS rn FROM Food WHERE food_type = 'veg' ) v ON f.rn = v.rn ORDER BY COALESCE(f.rn, v.rn)
低版本Sybase(不支持窗口函数)
通过带identity自增列的临时表生成行号:
-- 生成带行号的水果临时表 SELECT IDENTITY(8) AS rn, names INTO #fruit_temp FROM Food WHERE food_type = 'fruit' ORDER BY names -- 生成带行号的蔬菜临时表 SELECT IDENTITY(8) AS rn, names INTO #veg_temp FROM Food WHERE food_type = 'veg' ORDER BY names -- 关联输出结果 SELECT CASE WHEN COALESCE(f.rn, v.rn) = 1 THEN 1 ELSE NULL END AS ID, f.names AS fruit, v.names AS veg FROM #fruit_temp f FULL OUTER JOIN #veg_temp v ON f.rn = v.rn ORDER BY COALESCE(f.rn, v.rn) -- 清理临时表 DROP TABLE #fruit_temp DROP TABLE #veg_temp
注意事项
- SQL中
ORDER BY names可以替换为你实际需要的排序规则,比如按数据录入顺序排序可以替换为对应时间字段、主键字段 - 示例中ID固定展示为1,如果需要关联实际业务ID,替换CASE语句里的固定值1为对应字段取值即可
- 全外连接会保证两类数据不丢失:如果水果数量多于蔬菜,多余行的veg列为空;如果蔬菜数量多于水果,多余行的fruit列为空
内容的提问来源于stack exchange,提问作者CKuttan
相关产品推荐
相关产品推荐

