SQL Server中如何从两张不同表中查询选取指定列数据
SQL Server跨两张含PartNumber列表取数实现方法
你当前编写的语句存在语法错误:SQL中不支持使用AND直接拼接两个独立的SELECT查询块,需要根据实际业务要的结果形态,选择对应写法:
写法1:关联匹配取横向拼接的结果
如果你的需求是获取PartNumber=44320对应的订单详情,同时匹配拿到该零件的库存数据,也就是把两张表匹配到的同零件行的字段横向拼到同一行结果里,使用JOIN关联即可:
-- 取OrderDetails所有字段+匹配到的Items表库存字段 SELECT od.*, i.Stock FROM OrderDetails od INNER JOIN Items i ON od.PartNumber = i.PartNumber -- 两张表通过PartNumber列匹配 WHERE od.PartNumber = 44320
- 如果需要保留OrderDetails中所有PartNumber=44320的记录,哪怕Items表中没有该零件的库存数据,把语句里的
INNER JOIN替换为LEFT JOIN即可。
写法2:结果集纵向合并
如果你的需求是分别从两张表查数据,把两个查询的结果上下拼接成同一个结果集返回,需要保证两个查询返回的列数量、对应列的数据类型一致,使用UNION ALL实现:
-- 从OrderDetails取指定列 SELECT PartNumber, OrderQty AS DataValue, 'OrderDetail' AS DataSource -- 标记数据来源 FROM OrderDetails WHERE PartNumber = 44320 UNION ALL -- 纵向拼接两个结果集 -- 从Items取对应结构的列 SELECT PartNumber, Stock AS DataValue, 'ItemStock' AS DataSource FROM Items WHERE PartNumber = 44320
UNION ALL不会对合并后的结果做去重处理,性能更好;如果需要剔除完全重复的行,可以替换为UNION。
注意事项
- 非必要不要使用
SELECT *查询,建议明确列出实际需要的字段,减少不必要的性能开销,也能避免表结构变动时返回不符合预期的字段。 - 写JOIN关联时必须带上
ON后的匹配条件,漏写条件会生成笛卡尔积,返回大量无效冗余数据。
内容的提问来源于stack exchange,提问作者howdy
相关产品推荐
相关产品推荐

