SQL Server,想要查询某表数据,但表名存放在别的表内,SQL语句怎么写?

文章提供了一个使用动态SQL查询的案例,以解决从多个具有相同结构的表(如apple和banana)中获取每个表的最低价格、最低价格的ID、最大尺寸以及最大尺寸ID的需求。这种方法适用于支持ROW_NUMBER函数的数据库系统,如SQLServer、Oracle、MySQL8、Doris、Hive和Impala。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                动态SQL查询案例

需求描述:

原始的表名、表的属性描述信息在summary表中,每个表有类似的字段:id、price、size,通过SQL能查询到所有表的如下记录: 表名、表属性名、最低价格、最低价格对应ID、最大尺寸、最大尺寸对应ID。

 解决方法:

-- 1 定义表并初始化数据(支持ROW_NUMBER的SQL Server、Oracle、MariaDB、Mysql 8、Doris、Hive、Impala等)
CREATE TABLE apple (
  ID int,
  price int,
  size int
);
CREATE TABLE banana (
  ID int,
  price int,
  size int
) ;
CREATE TABLE summary (
  id int,
  table_name varchar(30),
  table_desc varchar(30)
) ;
INSERT INTO apple(ID, price, size) VALUES (1, 30, 9);
INSERT INTO apple(ID, price, size) VALUES (2, 10, 4);
INSERT INTO apple(ID, price, size) VALUES (3, 40, 6);

INSERT INTO banana(ID, price, size) VALUES (20, 8, 10);
INSERT INTO banana(ID, price, size) VALUES (21, 15, 24);

INSERT INTO summary(id, table_name, table_desc) VALUES (1, 'APPLE', '苹果');
INSERT INTO summary(id, table_name, table_desc) VALUES (2, 'BANANA', '香蕉');

-- 2 定义动态SQL,可以再封装成存储过程
DECLARE @sql varchar(6000)
set @sql = '' 
select @sql = @sql +'SELECT '+''''+TABLE_NAME+''''+' TABLE_NAME,'+''''+TABLE_DESC+''''+' TABLE_DESC' + ',min(min_price) min_price,
min(price_id_rn) min_price_id,
min(max_size) max_size,
min(size_id_rn) max_size_id
FROM
(
SELECT MIN(PRICE)OVER(ORDER BY (SELECT 1)) min_price,
CASE WHEN ROW_NUMBER()OVER(ORDER BY price ASC) = 1 THEN ID ELSE NULL END price_id_rn,
MAX(SIZE)OVER(ORDER BY (SELECT 1)) max_size,
CASE WHEN ROW_NUMBER()OVER(ORDER BY size DESC)=1 THEN ID ELSE NULL END   size_id_rn
FROM '
+ table_name 
+ ')B UNION ALL ' from SUMMARY
set @sql = SUBSTRING(@sql,1,LEN(@sql)-10)
-- SELECT @sql
EXEC( @sql)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShenLiang2025

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值