经常在数据库完成各类查询需要相当多的数据,或先建表再查询,对于基于查询验证时非常麻烦,这里介绍可以无需建立表就能直接用sql构造数据且查询的方法
SELECT
t1.AREA,
t1.USE,
t2.name AS DATA_TYPE,
COALESCE(t1.PROG_NUM, 0) AS PROG_NUM
FROM
(
-- 第一个数据表
SELECT '地区1' AS AREA, '战车' AS USE, '步战车' AS DATA_TYPE, 10 AS PROG_NUM FROM DUAL
UNION ALL
SELECT '地区1', '战车', '水战车', 10 FROM DUAL
UNION ALL
SELECT '地区1', '战车', '土战车', 20 FROM DUAL
UNION ALL
SELECT '地区2', '战车', '步战车', 10 FROM DUAL
UNION ALL
SELECT '地区2', '战车', '水战车', 10 FROM DUAL
UNION ALL
SELECT '地区3', '战车', '步战车', 9 FROM DUAL
) t1
CROSS JOIN
(
-- 第二个数据表(name)
SELECT '步战车' AS name FROM DUAL
UNION ALL
SELECT '水战车' FROM DUAL
UNION ALL
SELECT '土战车' FROM DUAL
) t2
LEFT JOIN
(
-- 第一个数据表,仅用于补充缺失的地区和战车类型
SELECT '地区1' AS AREA, '战车' AS USE, '步战车' AS DATA_TYPE, 0 AS PROG_NUM FROM DUAL
UNION ALL
SELECT '地区1', '战车', '水战车', 0 FROM DUAL
UNION ALL
SELECT '地区1', '战车', '土战车', 0 FROM DUAL
UNION ALL
SELECT '地区2', '战车', '步战车', 0 FROM DUAL
UNION ALL
SELECT '地区2', '战车', '水战车', 0 FROM DUAL
UNION ALL
SELECT '地区2', '战车', '土战车', 0 FROM DUAL
UNION ALL
SELECT '地区3', '战车', '步战车', 0 FROM DUAL
) t3
ON t1.AREA = t3.AREA AND t1.DATA_TYPE = t3.DATA_TYPE
ORDER BY t1.AREA, t1.USE, t2.name;
在这个查询中,首先我们使用 CROSS JOIN
来将第一个数据表和第二个数据表中的所有记录进行组合。然后,使用 LEFT JOIN
将组合后的结果与一个仅用于补充缺失数据的表连接,补充缺失的地区和战车类型,并将 PROG_NUM 设置为 0。最后,使用 COALESCE
函数来将 PROG_NUM 为 NULL 的记录填充为 0,并按照 AREA、USE 和 DATA_TYPE 进行排序。请注意,这里的数据来源使用了 DUAL 表作为演示,实际应用中需要根据实际情况替换为相应的表名。
这样直接通过SQL就能直接构造数据,且在一个查询中完成构造数据和查询数据。
标签:AREA,UNION,一例,战车,巧妙,查询,DUAL,t1,SELECT From: https://blog.51cto.com/u_14316134/6839304