如何用SQL实现关联Table1与Table2并按Table2列值筛选Table1列?
SQL实现方案:根据关联表筛选匹配列
现有数据表
Table1
| col_1 | a | b | c |
|---|---|---|---|
| 1 | 12 | 13 | 14 |
Table2
| col_1 | col_2 |
|---|---|
| 1 | a |
| 1 | c |
需求说明
将Table1与Table2通过table1.col_1 = table2.col_1关联,筛选出Table1中列名与Table2.col_2值匹配的列。
静态实现方案(已知匹配列)
如果已明确Table2.col_2对应的目标列(如示例中的a和c),可直接编写固定SQL:
SELECT DISTINCT t1.col_1, t1.a, t1.c FROM Table1 t1 JOIN Table2 t2 ON t1.col_1 = t2.col_1;
使用DISTINCT避免因Table2多行关联导致结果重复。
动态实现方案(列名由Table2动态决定)
若Table2的col_2值不固定,需动态生成查询列,以下是主流数据库的实现方式:
MySQL/MariaDB
通过预处理语句生成并执行动态SQL:
SET @cols = (SELECT GROUP_CONCAT(DISTINCT t2.col_2 SEPARATOR ', ') FROM Table2 t2); SET @sql = CONCAT('SELECT DISTINCT t1.col_1, ', @cols, ' FROM Table1 t1 JOIN Table2 t2 ON t1.col_1 = t2.col_1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PostgreSQL
利用string_agg拼接列名,结合EXECUTE执行动态逻辑:
DO $$ DECLARE cols text; BEGIN SELECT string_agg(DISTINCT col_2, ', ') INTO cols FROM Table2; EXECUTE format('SELECT DISTINCT t1.col_1, %s FROM Table1 t1 JOIN Table2 t2 ON t1.col_1 = t2.col_1', cols); END $$;
SQL Server
使用STRING_AGG拼接列名,通过sp_executesql执行动态SQL:
DECLARE @cols NVARCHAR(MAX); DECLARE @sql NVARCHAR(MAX); SELECT @cols = STRING_AGG(DISTINCT col_2, ', ') FROM Table2; SET @sql = N'SELECT DISTINCT t1.col_1, ' + @cols + N' FROM Table1 t1 JOIN Table2 t2 ON t1.col_1 = t2.col_1'; EXEC sp_executesql @sql;
内容的提问来源于stack exchange,提问作者Muhammad Irtiza
相关产品推荐
相关产品推荐

