我的表格有点像以下内容:
GroupText(itemId int,tableName nvarchar,文本nvarchar) 1,“ ItemTable1”,“某些文本” 2,“ ItemTable2”,“某些文本” 3,“ ItemTable2”,“某些文本” 4,“ ItemTable3”,“某些文本”
ItemTable1(itemId int,isProposal) 1、1
ItemTable2(itemId int,isProposal) 2,0 3,1
ItemTable3(itemId int,isProposal) 4,0
我正在尝试从GroupText中选择文本列的方法,其中isProposal在属于该文本的ItemTable中为1
我也许可以做这样的事情:
SELECT text
FROM GroupText gt
WHERE
(
(
gt.tableName = 'ItemTable1' AND
(
SELECT COUNT(itemId)
FROM ItemTable1 tbl1
WHERE tbl1.itemId = gt.itemId AND tbl1.isProposal = 1
) > 0
) OR
(
gt.tableName = 'ItemTable2' AND
(
SELECT COUNT(itemId)
FROM ItemTable2 tbl2
WHERE tbl2.itemId = gt.itemId AND tbl2.isProposal = 1
) > 0
) OR
...
)
但这不可行,因为有30多个表
我认为我有一个很好的主意,即将子查询放入一个函数中,其中tableName和itemId是参数
DECLARE @sql nvarchar(max)
SET @sql = N'SELECT isProposal FROM ' + @tableName + ' WHERE itemId = @itemId';
EXEC sp_executesql @sql,
然后使用如下代码获取值:
SELECT text
FROM GroupText gt
WHERE
functionName(gt.itemId, gt.tableName) = 1
但是不允许函数像这样执行sql
据我所知,视图也不是一种选择,因为它们无法像这样动态地构建sql
我现在唯一看到的选择是将其分为两部分。首先将所有数据从GroupText加载到临时表中,然后为每个项目调用一个更动态的sql(例如我在函数中尝试过的sql),看看是否应在结果中包含它
这是完成我正在尝试的最好方法还是有更好的方法?