You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL EXISTS判断查询如何返回匹配targetId所在的表名?

适配SQL Server的修改方案

方案1:SQL Server 2017及以上版本(支持STRING_AGG函数)

直接在子查询中新增表名字段,过滤目标ID后聚合拼接表名即可:

SELECT 
    CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END AS flag,
    ISNULL(STRING_AGG(tableName, ', '), '') AS tableNames
FROM (
    SELECT targetId, 'Table1' AS tableName FROM [myDatabase].[dbo].[Table1] UNION ALL
    SELECT targetId, 'Table2' AS tableName FROM [myDatabase].[dbo].[Table2] UNION ALL
    SELECT targetId, 'Table3' AS tableName FROM [myDatabase].[dbo].[Table3] UNION ALL
    SELECT targetId, 'Table4' AS tableName FROM [myDatabase].[dbo].[Table4] 
) AS allRecords
WHERE targetId = 'idToSearch';

说明:这里把原来的UNION换成UNION ALL,因为不同表的记录不需要去重,查询性能更高。ISNULL用来处理ID不存在时返回空字符串而非NULL的场景,不需要可以删掉。

方案2:SQL Server 2016及更早版本(无STRING_AGG函数)

用变量拼接的方式实现,推荐下面的写法,每个子查询先过滤目标ID,数据量大的时候性能优势更明显:

DECLARE @tableNames NVARCHAR(MAX) = '';
DECLARE @flag BIT = 0;

SELECT @tableNames = @tableNames + tableName + ', ', @flag = 1
FROM (
    SELECT DISTINCT 'Table1' AS tableName FROM [myDatabase].[dbo].[Table1] WHERE targetId = 'idToSearch' UNION ALL
    SELECT DISTINCT 'Table2' AS tableName FROM [myDatabase].[dbo].[Table2] WHERE targetId = 'idToSearch' UNION ALL
    SELECT DISTINCT 'Table3' AS tableName FROM [myDatabase].[dbo].[Table3] WHERE targetId = 'idToSearch' UNION ALL
    SELECT DISTINCT 'Table4' AS tableName FROM [myDatabase].[dbo].[Table4] WHERE targetId = 'idToSearch'
) AS matchedTables;

-- 去除末尾多余的逗号和空格
IF LEN(@tableNames) > 1
    SET @tableNames = LEFT(@tableNames, LEN(@tableNames) - 1);

SELECT @flag AS flag, @tableNames AS tableNames;

内容的提问来源于stack exchange,提问作者yaylitzis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:54:03