如何在C#中实现SQL Server多表关联查询?
解决方案
场景1:收集所有表的LEADER值及对应表名
如果你的需求是把16张表中所有的LEADER值和它们所属的表名全部列出来,不需要做关联过滤,用UNION ALL是最直接的方式:
SELECT 'GroupLeaders' AS 所属表名, LEADER FROM GroupLeaders UNION ALL SELECT 'Account' AS 所属表名, LEADER FROM Account UNION ALL SELECT 'Engineers' AS 所属表名, LEADER FROM Engineers -- 把剩下的13张表按同样格式添加进来
注意点:
- 确保所有表的LEADER列数据类型一致,要是有差异,用
CAST(LEADER AS VARCHAR(50))这类语句统一类型,避免报错。 - 用
UNION ALL而不是UNION,因为UNION会自动去重,如果你需要保留重复值就用前者,效率也更高。
场景2:基于LEADER关联所有表(类似你的示例代码)
如果需要像示例那样,把所有表通过LEADER字段关联起来展示相关数据,得先明确每张表之间的关联逻辑(比如示例里是GroupLeaders.id = Account.Leader),然后扩展JOIN语句:
修正后的示例SQL(原SQL未关联Engineers,属于笔误):
SELECT GroupLeaders.ID, Account.Leader AS Account_Leader, Engineers.Leader AS Engineers_Leader -- 依次添加其他13张表的LEADER字段,比如 TableX.Leader AS TableX_Leader FROM GroupLeaders INNER JOIN Account ON GroupLeaders.id = Account.Leader INNER JOIN Engineers ON GroupLeaders.id = Engineers.Leader -- 继续添加其他表的JOIN条件,比如 INNER JOIN TableX ON GroupLeaders.id = TableX.Leader
对应的C#代码(中文说明版):
// 创建SQL命令对象,执行多表关联查询 SqlCommand cmd = new SqlCommand( "SELECT GroupLeaders.ID, Account.Leader, Engineers.Leader " + "FROM GroupLeaders INNER JOIN Account ON GroupLeaders.id = Account.Leader " + "INNER JOIN Engineers ON GroupLeaders.id = Engineers.Leader", conn // conn是已初始化并打开的数据库连接对象 );
注意点:
- 用
INNER JOIN会过滤掉没有匹配关联条件的记录,如果想保留所有表的记录,改用LEFT JOIN或者FULL OUTER JOIN。 - 16张表关联时要注意查询性能,必要时给LEADER、关联字段添加索引。
内容的提问来源于stack exchange,提问作者Joel Silva
相关产品推荐
相关产品推荐

