如何扩展一个sql表?

Posted

技术标签:

【中文标题】如何扩展一个sql表?【英文标题】:How to expand a sql table? 【发布时间】:2016-01-14 11:02:57 【问题描述】:

我想创建一个视图,其中列出了所有人的所有生日。假设我想“扩展”一个表格。

我有一个带有属性 ID 和生日的表 Person。 我有一个函数 FuncBirthdays 需要一个 ID 和一个生日,然后它列出了当前日期之前的所有生日。例如:

SELECT * FROM FuncBirthdays(123, '01.01.2014');

Result:
123; '01.01.2014'
123; '01.01.2015'
123; '01.01.2016'
// Current date is 14.01.2016, so the list stops here.

现在我想创建一个视图,其中包含表 Person 中所有人的所有生日。

SELECT * 
FROM 
 Person
INNER JOIN 
 (SELECT * FROM FuncBirthdays(Person.ID, Person.Birthday)) FB
ON Person.ID = FB.ID

MS SQL Server 2012 Studio 中的错误信息是 Person.ID 和 Person.Birthday 未绑定。

我猜这种方式与 JOINS 的完成方式相冲突。我可以使用哪些 SQL 概念来扩展表? Person 中的每个数据集都会在输出中生成可变数量的数据集。目前我已经使用手动收集数据的 C#.net 函数解决了这个问题。有没有纯SQL的方式?

谢谢

马丁

【问题讨论】:

您可以使用 [APPLY 运算符] 从 FROM 子句调用表值函数。 @DMayuri 在下面提供了一个很好的例子。 【参考方案1】:

“MS SQL Server 2012 Studio 中的错误消息是 Person.ID 和 Person.Birthday 未绑定。”

是因为您试图访问无法访问的加入结果集中的人员。据我所知,在这种情况下,您需要使用交叉应用。请尝试以下查询

SELECT * FROM Person p
CROSS APPLY
(
    SELECT * FROM FuncBirthdays(p.ID, p.Birthday)   
) FB
WHERE p.ID = FB.ID

【讨论】:

您可以将其缩短为:CROSS APPLY FuncBirthdays(p.ID, p.Birthday) AS FB【参考方案2】:
With CTE1 (ID, Birthday) AS
(
    SELECT * FROM FuncBirthdays(p.ID, p.Birthday)
)
SELECT *
FROM CTE1, Person p
WHERE p.ID = CTE1.ID

【讨论】:

在 CTE 中没有对表 Person 的引用。将 Person 与生日功能连接起来仍然是个问题。但我可以用普通的 SQL Stmnt 替换 DMayuri 示例中的函数。

以上是关于如何扩展一个sql表?的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱 SQL Server 2000 中的扩展表属性?

Oracle 如何扩展表空间

sql 如何解决Oracle“ORA-01652:无法在表空间X中用N扩展临时段”

sql语句 如何创建一个表啊?

如何在 SQL Graph 表中创建递归边?

如何利用SQL语句查看某一个表全部列或单个列的属性?