组合两个不同数据集的列

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】:

如果您明确列出您的列 - 这是最佳实践 - 在为 cd 添加来自 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 中未在问题中提及。所以你真的应该接受这一点,如果你想进一步探索,问一个新问题。

以上是关于组合两个不同数据集的列的主要内容,如果未能解决你的问题,请参考以下文章

当它们具有不同的列集时,按行组合两个数据帧(rbind)

显示来自两个不同数据集的数据,其中一个数据集为空

在 spark java 中取两个数据集并集的必要条件是啥

如何在mysql中对具有不同数据集的列进行排序

合并在Apache spark中具有不同列名的两个数据集

如何在 s-s-rS 中组合多个结果集?