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

如何合并SQL Server中不同表列的两个查询并在C# GridView展示结果?

嘿,这个问题我太熟啦!得先看你要合并的两个查询是想把结果上下拼起来(纵向合并行)还是左右拼起来(横向合并列),两种场景的处理方式完全不一样,我给你唠唠具体怎么做:

情况1:纵向合并(把两个结果集的行叠在一起)

这种情况适用于两个查询返回的列数一致、对应列的数据类型匹配的场景,比如一个查会员表的姓名手机号,另一个查临时访客表的姓名手机号,结构完全对齐。

我们用UNION或者UNION ALL来实现:

  • UNION ALL:直接把所有行合并,保留重复数据,效率更高(推荐优先用这个,除非你需要去重)
  • UNION:会自动去掉两个结果集中的重复行,但性能稍差

举个实际例子:

-- 第一个查询:获取会员信息
SELECT MemberName AS Name, MemberPhone AS Phone FROM MemberTable
UNION ALL
-- 第二个查询:获取临时访客信息
SELECT VisitorName AS Name, VisitorPhone AS Phone FROM VisitorTable

⚠️ 要注意:两个查询的列名可以不一样,但必须用别名统一成相同的名称(比如上面的Name和Phone),而且对应列的数据类型得匹配(比如都是varchar类型)。

情况2:横向合并(把两个表的不同列关联在一起展示)

如果是想把两个表的不同字段凑到同一条记录里(比如用户基本信息+他的订单统计),就得用JOIN(内连接、左连接等),前提是两个表有可以关联的字段(比如用户ID、订单ID)。

举个例子,我们要查每个用户的姓名、邮箱,以及他的订单总数:

SELECT 
    u.UserName, 
    u.UserEmail, 
    ISNULL(o.OrderTotal, 0) AS OrderTotal -- 用ISNULL把NULL转成0,显示更友好
FROM Users u
-- 左连接:即使用户没有订单也会显示,订单数为0
LEFT JOIN (
    -- 子查询:先统计每个用户的订单数量
    SELECT UserID, COUNT(*) AS OrderTotal FROM Orders GROUP BY UserID
) o ON u.UserID = o.UserID

这里的LEFT JOIN保证所有用户都会被展示,哪怕他没有任何订单;如果用INNER JOIN,只会显示有订单的用户,根据你的需求选就行。

把合并后的结果绑定到C# GridView

搞定SQL之后,把数据绑到GridView就很简单啦,分两步走:

1. 前端ASPX页面添加GridView控件

可以让它自动生成列,也可以手动定义列(更灵活):

<asp:GridView ID="UserInfoGridView" runat="server" 
    AutoGenerateColumns="True" 
    CssClass="table table-bordered"> <!-- 加个CSS类让表格好看点 -->
</asp:GridView>

2. 后台C#代码执行SQL并绑定数据

在Page_Load事件里写逻辑就行,记得用using确保资源释放:

using System.Data;
using System.Data.SqlClient;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) // 只在首次加载时绑定数据
    {
        // 你的SQL Server连接字符串,建议从Web.config里读取更规范
        string connStr = "Server=你的服务器名;Database=你的数据库名;User Id=用户名;Password=密码;";
        // 把你刚才写的合并SQL放这里
        string mergeSql = @"SELECT u.UserName, u.UserEmail, ISNULL(o.OrderTotal, 0) AS OrderTotal FROM Users u LEFT JOIN (SELECT UserID, COUNT(*) AS OrderTotal FROM Orders GROUP BY UserID) o ON u.UserID = o.UserID";

        using (SqlConnection conn = new SqlConnection(connStr))
        {
            SqlCommand cmd = new SqlCommand(mergeSql, conn);
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            
            conn.Open();
            adapter.Fill(dt);
            conn.Close();

            // 绑定到GridView
            UserInfoGridView.DataSource = dt;
            UserInfoGridView.DataBind();
        }
    }
}

额外提醒

  • 如果两个查询完全没有关联字段,硬要横向合并可以用CROSS JOIN,但会产生笛卡尔积(比如10条用户×5条订单=50条数据),一般不推荐,除非你明确知道需求。
  • 用UNION的时候,列的顺序必须严格对应,数据类型也要兼容,不然会直接报错哦!

内容的提问来源于stack exchange,提问作者Niska DeLaVega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:12:16