如何扩展一个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表?的主要内容,如果未能解决你的问题,请参考以下文章