Sql Server如何在具有不同后缀的不同表中查找值

Posted

技术标签:

【中文标题】Sql Server如何在具有不同后缀的不同表中查找值【英文标题】:Sql Server how to find values in different tables that have different suffix 【发布时间】:2021-03-12 14:34:33 【问题描述】:

我正在努力寻找可能在不同表中的值,但使用 UNION 很痛苦,因为有很多表。

[Different table that contains the suffixes from the TestTable_]
| ID       |      Name|
| -------- | -----------|
| 1        | TestTable1 |
| 2        | TestTable2 |
| 3        | TestTable3 |
| 4        | TestTable4 |

TestTable1 content:
| id       | Name   | q1           |   a1 |
| -------- | ---------------------------------------- |
| 1        | goose  | withFeather? |featherID         |
| 2        | rooster| withoutFeather?|shinyfeatherID  |
| 3        | rooster| age            | 20             |

TestTable2 content:
| id       | Name              | q1             |   a1 |
| -------- | ---------------------------------------------------|
| 1        | brazilian_goose  | withFeather?   |featherID       |
| 2        | annoying_rooster | withoutFeather?|shinyfeatherID  |
| 3        | annoying_rooster | no_legs?       |dead            |

TestTable3 content:
| id       | Name   | q1           |   a1 |
| -------- | ---------------------------------------- |
| 1        | goose  | withFeather? |featherID         |
| 2        | rooster| withoutFeather?|shinyfeatherID  |
| 3        | rooster| age            | 15             |


常用列:q1 和 a1

有没有办法在不使用 UNION 的情况下解析所有这些以查找特定值,因为其中一些可能有不同的列?

类似于:检查所有这些表中是否存在“q1='age'”(从 1 到 50) 选择 q1,* 来自(某事) 其中 q1 存在于 (TestTable_*)... 或类似的地方。

如果不可能,也不是问题。

【问题讨论】:

您能否澄清您要回答的问题,例如:“在哪个表中,列 q1 等于 42?”或“在哪个表中 q1 等于 a1?”我不清楚您所说的“可能在不同表中的值”到底是什么意思。 如果您希望一个数据集中的所有数据易于访问,请不要将它们存储在不同的表中。如果您有多个表并希望它们在一个数据集中,您需要JOINUNION (ALL) 它们。没有SELECT Columns FROM dbo.[Test_Table_*] 语法。似乎问题出在您的设计上。 如果你有一个糟糕的数据模型——比如跨表拆分实体——那么你就不得不忍受使用union的“痛苦”。修复数据模型,让你只有一张表。 听起来您的设计不符合要求。您可能需要考虑一项任务,即查询每个表并在主索引类型表中创建可搜索结果,或者动态 Sql 可能是一种解决方案,如果没有具体示例就很难说。 更新了一点。不幸的是,无法改变牌桌上的任何东西。 【参考方案1】:

您可以使用动态 SQL,但在这样的情况下,我有一个表列表,我想快速执行相同的操作是使用电子表格将表列表粘贴到其中并键入查询用@table之类的东西进入单元格,然后使用替换函数替换它。

我只是将列表粘贴到 SSMS 中,然后使用 SHIFT+ALT+ArrowKey 选择列并开始输入内容。

这是我的表格列表

然后我使用那个组合键。如您所见,我的光标现在已经选择了所有这些行。

现在我可以开始输入,所有选择的行都会得到输入。

然后我就去表名的另一边重复这个动作

这不是一个完美的解决方案,但它是一种快速而肮脏的快速重复操作的方法。

如果您想查找具有该列名称的所有表,您可以使用信息架构。

Select table_name from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME = 'q1'

【讨论】:

【参考方案2】:

鉴于您所寻求的解决方案类型,我可以提供一种我不得不在旧系统上使用的方法。

您可以在sys.columns 中查询您需要在N 个表中找到的列的名称,并使用object_id 连接到sys.tables where type='U'。这将为您提供一个表名列表。

然后,您可以从此列表中为每个表构建一个工作查询,并根据您的要求(这是临时的吗?)或者自己手动执行它,或者构建一个使用sp_executesql 为您完成的过程

例如

select t.name, c.name
into #workingtable
from sys.columns c 
join sys.tables t on t.object_id=c.object_id
where c.name in .....

伪代码:

当#working table 中存在行时开始循环

从#workingtable 中选择前 1 行

设置@sql=您的查询特定于该表和列

exec(@sql) / sp_executesql / try/catch 必要时

从工作表中删除行

结束循环

希望至少可以为您提供如何实现您的要求的想法。

【讨论】:

以上是关于Sql Server如何在具有不同后缀的不同表中查找值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SSMA(用于访问 SQL Server)将具有不同列的表迁移到现有表中?

如何合并 SQL Server 中具有映射到通用描述的不同列标题的表?

如何使用sql从具有不同列的两个表中获取不同的记录

如何获取在 SQL Server 内部数据库的不同表中重复的列[重复]

SQL Server:填写每个实体具有不同日期范围的缺失日期

如何在 SQL 服务器中将数据插入到两个不同的表中,同时在 SQL 中具有 ORDER# 主键