组合两个不同数据集的列
Posted
技术标签:
【中文标题】组合两个不同数据集的列【英文标题】:Combining columns of two different datasets 【发布时间】:2021-02-11 21:54:55 【问题描述】:我有一个 UDF,它需要始终返回相同的数据集结构,即 a、b、c 和 d 列。 它需要从多个数据源返回一个 UNION ALL,包括其他 UDF:s。
假设我有另一个函数 (myOtherUDF),它返回列 a 和 b。 我还有一个表(myTable),列名为 a、b、c 和 d。 我想要做的是以列 c 和 d 被添加到 myOtherUDF 的方式对 myOtherUDF 和 myTable 进行 UNION ALL。
即尽管 myOtherUDF 缺少列 c 和 d,但我希望它能够工作:
CREATE FUNCTION myUDF (@param INT)
RETURNS @tbl TABLE
(
a int NOT NULL,
b int NOT NULL,
c int NOT NULL,
d int NOT NULL
)
AS
BEGIN
INSERT INTO @tbl
SELECT * FROM myTable
UNION ALL // this will obviously not work
SELECT * FROM myOtherUDF(@param)
RETURN
END
我不能使用进程来预加载表,也不能使用视图,因为我需要参数@param。
【问题讨论】:
当然我的意思是我不能使用存储过程,而不是进程。抱歉打错字了。 c & d 列暂时可以换成cero,只要我能把return set弄对就行了 我正在使用 python 中的内联 sql 从 Web 应用程序构建联合语句。对于这种情况,很难明确指定列名 您使用多语句而不是内联表函数的任何原因 “我正在使用 python 中的内联 sql 来构建联合语句” - 怎么样?你已经在一个函数中展示了它?您确定不是从 Python 创建函数吗?你需要明确你在做什么。 【参考方案1】:如果您明确列出您的列 - 这是最佳实践 - 在为 c
和 d
添加来自 myOtherUDF
的默认值之后,您会立即解决此问题;
INSERT INTO @tbl (a, b, c, d)
SELECT a, b, c, d
FROM myTable
UNION ALL
SELECT a, b, 0, 0
FROM myOtherUDF(@param);
RETURN;
要明确的是,您几乎不应该在不列出列的情况下永远不要 select *
和永远不要 insert into table
。它节省了很多问题。
出于性能原因,使用内联表值函数几乎总是更好,例如
CREATE FUNCTION myUDF
(
@param INT
)
RETURNS TABLE
RETURN
SELECT a, b, c, d
FROM myTable
UNION ALL
SELECT a, b, 0, 0
FROM myOtherUDF(@param);
【讨论】:
@JonasWidmark 对……所以?这对我的回答有何影响? 我需要的数据集的结构将始终由 myTable 定义,但列数会随时间而变化。我真正想做的是将查询语句构建为多个源的 UNION(或类似),尽管其中一些例如。 myOtherODF 仅与四列中的两列重叠。我认为 UDF 可能是一个解决方案,但没有必要。在我用 python 构建的查询中构建(和默认设置)所有列(有很多)会很乏味,我宁愿在数据库中找到一个解决方案。 对不起,我在完全编辑之前错误地发布了最后一条评论。 数据库不像代码,如果您进行架构更改,您可能需要在某处更新您的代码。 SQL 不是为您可能在 Python 或 C# 中执行的通用处理类型而设计的。因此,根据我对您的理解,将这个逻辑封装在一个函数中,正如我向您展示的那样,这可能是处理它的最干净的方法。是的,如果您更改架构,则必须更新函数以反映这一点,但仅此而已,它都在一个地方,您可以在那里看到它。恐怕没有灵丹妙药来处理未来的数据库架构更改,您需要系统来处理。 话虽如此,我的回答确实回答了所提出的具体问题,您的实际问题仅在后续的 cmets 中未在问题中提及。所以你真的应该接受这一点,如果你想进一步探索,问一个新问题。以上是关于组合两个不同数据集的列的主要内容,如果未能解决你的问题,请参考以下文章