【问题标题】:SQL: Replacing part of query by subquery in FROM clauseSQL:在 FROM 子句中用子查询替换部分查询
【发布时间】:2019-07-04 15:44:11
【问题描述】:

我有一个数据库,其中包含一个名为 [Table] 的表,其中列出了该数据库中的所有表。现在我想使用一些 JOINS 编写一个 SQL 查询,它从子查询中的 [Table] 获取特定的表名以从该表中进行选择...我希望这不会太混乱。

所以 [Table] 看起来像这样:

IdTable    Tablename
1          Adress
2          Project
3          User
...

查询应如下所示:

SELECT * FROM (SELECT Type FROM dbo.[Table] WHERE tablename = 12)

这样的事情可能吗?

我知道,子查询是可能的,但在这种情况下我不知道该怎么做。

提前致谢。

问候 拉尔斯

【问题讨论】:

  • 您必须使用“动态 sql”来实现这一点。
  • 一开始为什么要写这样的东西?您尝试解决的实际问题是什么? SQL 查询中的表类似于强类型语言中的类型。您不能只通过传递不同的字符串来更改它们。另一方面,使用 正确 表从客户端发送查询是微不足道的。创建查询特定表的视图也很容易。此外,将数字映射到表名并不比使用表名本身更好。而不是select * from SomeQueryFrom(1),你可以写select * from Address
  • I have a database including a table called [Table] which lists all tables in that database. SQL Server 已经为此提供了sys.tables 表。您不需要创建额外的表。事实上,您可以使用OBJECT_NAME 函数从对象ID 中检索表名。你不需要额外的桌子。您可以编写 declare @sql nvarchar(2000)='SELECT * from ' + QUOTENAME(OBJECT_NAME(@someID)); exec @sql; 来创建和执行基于表 ID 的查询

标签: sql sql-server select tablename


【解决方案1】:

试试下面的动态代码以获得预期的结果。

DECLARE @sqlCommand  AS NVARCHAR(MAX)
DECLARE @TableName AS NVARCHAR(MAX)

SELECT @TableName = tablename FROM dbo.[Table] WHERE Type = 12

SET @sqlCommand= N'SELECT * FROM '+@TableName+''

EXEC (@sqlCommand)

注意:我猜您想选择 Type = 12 的 TableName,我会相应地更改选择和过滤。

您也可以直接执行如下查询,无需创建命令字符串-

DECLARE @TableName AS NVARCHAR(MAX)
SELECT @TableName = tablename FROM dbo.[Table] WHERE Type = 12

EXEC (N'SELECT * FROM '+@TableName+'')

【讨论】:

  • 为什么不SELECT @SQL = CONCAT(N'SELECT * FROM ', QUOTENAME(TableName)) FROM dbo.[Table] WHERE Type = 12; 。不需要@TableName变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2020-05-08
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多