首页 > 解决方案 > T SQL 根据来自另一个 Select 的值选择表

问题描述

我有以下选择,它检索所有以“ABC_”开头的表:

SELECT *
FROM information_schema.tables
WHERE table_name  LIKE 'ABC_%'

所有“ABC_”表都包含一个名为“SKU”的字段。

我有另一个 SELECT 检索 SKU 列表:

SELECT SKU from tblProducts

如何从 tblProducts 返回包含至少一个 SKU 的“ABC_”表列表?

标签: sqlsql-servertsql

解决方案


只需要一点动态 SQL 魔法:

使用您需要的表创建一个联合所有查询,每个内部查询都带有 awhere exists以确保其中至少一行具有sku也在tblproduct表中的值:

DECLARE @Sql nvarchar(max) = '';

SELECT @Sql = @Sql +N'UNION ALL SELECT '''+ table_name +N''' As TableName FROM '+ QUOTENAME(table_name) +
N' As P WHERE EXISTS (SELECT 1 FROM tblProducts WHERE tblProducts.Sku = P.Sku) '
FROM information_schema.tables
WHERE table_name  LIKE 'ABC_%'

-- Remove the first "UNION ALL"
SELECT @Sql = STUFF(@Sql, 1, 10, '')

-- When dealing with Dynamic SQL, Print is your best friend
PRINT @Sql

-- Unremark once you check the printed SQL is what you wanted
--EXEC(@SQL)

推荐阅读