You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将首个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:15:47