如何将首个SQL查询结果通过UNION ALL应用于第二个查询?
解决方案
你的代码存在几个核心问题:循环中会覆盖查询变量、SQL语法有误,且当前逻辑是重复查询同一个库的表,并非合并多个库的数据。下面是修正后的实现方案:
修正后的代码示例
// 第一步:获取所有目标数据库名并存储到数组 $sql = sqlsrv_query($con, "select distinct [database] from Databases_2022") or die(sqlsrv_error()); $dbNames = []; while ($row = sqlsrv_fetch_array($sql, SQLSRV_FETCH_ASSOC)) { $dbNames[] = $row['database']; } // 第二步:构建UNION ALL子查询(合并所有库的目标表数据) $unionParts = []; $targetTableName = "你的实际表名"; // 替换成你要查询的具体表名 foreach ($dbNames as $dbName) { // 转义数据库名,避免特殊字符或SQL注入风险 $escapedDbName = sqlsrv_escape_string($con, $dbName); $unionParts[] = "select * from RESIDENT.DBO.[$escapedDbName].[$targetTableName]"; } $unionQuery = implode(" UNION ALL ", $unionParts); // 第三步:构建完整的统计查询语句 $tsql = "select tn, isnull(sum(case when stat = 1 then 1 else 0 end), '') as TEST, isnull(sum(case when stat in(1,4,6,7,9,10) then 1 else 0 end), '') as TEST2 from ($unionQuery) a group by tn order by tn"; // 执行最终查询并处理结果 $result = sqlsrv_query($con, $tsql) or die(sqlsrv_error()); while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) { // 按需输出或处理结果,示例: echo "tn: {$row['tn']}, TEST: {$row['TEST']}, TEST2: {$row['TEST2']}<br>"; }
关键说明
- 避免变量覆盖:先将所有数据库名存入数组,再统一拼接查询语句,不会丢失之前的库信息
- 语法修正:用方括号包裹数据库名和表名,避免特殊字符导致的语法错误,同时补全了原代码缺失的表名部分
- 安全防护:通过
sqlsrv_escape_string转义数据库名,防范SQL注入风险 - 逻辑修正:将多个数据库的目标表数据通过UNION ALL合并,再进行统一的聚合统计,符合你最初的需求
内容的提问来源于stack exchange,提问作者Ouss Ben
相关产品推荐
相关产品推荐

