在不知道 SQL 中的列的情况下创建表
Posted
技术标签:
【中文标题】在不知道 SQL 中的列的情况下创建表【英文标题】:Create a table without knowing its columns in SQL 【发布时间】:2017-01-18 13:26:13 【问题描述】:如何在事先不知道它到底包含多少列和哪些列的情况下创建一个表?
我的想法是我有一个包含 3 列的表 DATA:ID
、NAME
和 VALUE
我需要的是一种根据 NAME
的值获取多个值的方法 - 我无法使用简单的 WHERE
或 JOIN
来做到这一点(因为我需要其他值 - 使用其他 @987654328 @values - 稍后在我的查询中)。
由于此表的构造方式,我想PIVOT
它以便将NAME
的每个不同值转换为一列,以便在以后的搜索中更容易找到它。
我现在想要的是以某种方式将其保存到临时表/变量中,以便以后可以使用它来加入另一个查询的结果...
例如:
列:
CREATE TABLE MainTab
(
id int,
nameMain varchar(max),
notes varchar(max)
);
CREATE TABLE SecondTab
(
id int,
id_mainTab, int,
nameSecond varchar(max),
notes varchar(max)
);
CREATE TABLE DATA
(
id int,
id_second int,
name varchar(max),
value varchar(max)
);
现在是 DATA 表中的一些示例数据:
| id | id_second_int | name | value |
|-------------------------------------------------------|
| 1 | 5550 | number | 111115550 |
| 2 | 6154 | address | 1, First Avenue |
| 3 | 1784 | supervisor | John Smith |
| 4 | 3467 | function | Marketing |
| 5 | 9999 | start_date | 01/01/2000 |
::::
现在想象“name”有很多不同的值,在一个查询中,我需要根据“name”的值获取很多不同的值... 这就是为什么我将它旋转,以便数字、地址、主管、函数、开始日期……成为列。 由于可能的列的数量,我动态地执行此操作 - 我需要一段时间才能将所有这些都写在“IN”语句中 - 而且我不想记住每次新的“名称”时都手动添加它' 增值... 所以我关注了http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/
问题是我希望我的 execute(@query) 的结果存储在 tempTab / 变量中。我想稍后使用它来加入 mainTab ...... 如果我可以使用 @cols(它保存 DATA.name 的值)会很好,但我似乎无法找到一种方法来做到这一点。
另外: 如果我使用非动态方式(在“IN”之后手动记下所有值),我仍然需要创建一个名为 status 的列。现在在此列中(到目前为止,它到处都是 NULL,因为我的未透视表中不存在该值)我想要“打开”或“关闭”,具体取决于日期(假设我有 start_date 和 end_date,
CASE end_date
WHEN end_date < GETDATE() THEN pivotTab.status = 'closed'
ELSE pivotTab.status = 'open'
我在哪里可以放置此声明?假设我的主要查询如下所示:
SELECT * FROM(
(SELECT id_second, name, value, id FROM TABLE_DATA) src
PIVOT (max(value) FOR name IN id, number, address, supervisor, function, start_date, end_date, status) AS pivotTab
JOIN SecondTab ON SecondTab.id = pivotTab.id_second
JOIN MainTab ON MainTab.id = SecondTab.id_mainTab
WHERE pivotTab.status = 'closed';
【问题讨论】:
【参考方案1】:好吧,据我所知 - 您有一些 select 语句,只需要将其结果“转储”到某个临时表。在这种情况下,您可以使用 select into
语法,例如:
select .....
into #temp_table
from ....
这将根据 select 语句中的列创建临时表,并用 select datatement 返回的数据填充它。
参考MDSN。
【讨论】:
但是我必须将 temp_table 声明为一个表,然后它想知道不同的列 - 我不知道它将包含多少甚至哪些列......这就是我想要的原因使用动态 SQL 来做到这一点(但我在这方面是一个完全的菜鸟,并且仍在学习如何使用它)在这一点上完成我的任务我最需要的是关于我可以在我创建的 pivotTab 中填充某些列的位置的信息(例如,为列status
提供数据,具体取决于表中的其他值)
@LisekKL " 我必须将 temp_table 声明为表..." - 不,你不需要。 select into
会自动为您创建它并填充 select 语句返回的数据。还是我错过了你真正需要的东西?
好吧,抱歉,这对我不起作用的原因是因为我对数据库有只读访问权限,所以我无法创建表、函数或过程......你碰巧对如何使用 CASE 语句(以及放置位置)有任何想法,以便我可以根据需要在我的透视表中填充数据?
@LisekKL 好吧,在 SQL Server 中没有创建 temporary 表的特殊权限,因此即使您对数据库具有只读访问权限 - 您仍然可以创建 temporary 表(不是永久的)并在您的进一步查询中使用它们,直到您与 SQL 服务器的连接未关闭。可能这就是你所需要的......以上是关于在不知道 SQL 中的列的情况下创建表的主要内容,如果未能解决你的问题,请参考以下文章