开发者社区 问答 正文

SQL MINUS / EXCEPT命令模拟仅在插入时用于列

MINUS / EXCEPT命令或代码替代方法仅适用于列吗?由于MINUS / EXCEPT命令适用于行,因此适用于列呢?

掩码表(物理存在):

id col1 col2 col3 col4 ... colN comment doesn't A B C D ... Z --alphabet correct sequence matter col [i]的列数据类型彼此相等。

传入选择流(不是物理表,而是由于从其他表进行其他复杂的联合选择而表示为表):

col1 col2 col3 col4 ... colN comment A B C D ... Z --alphabet correct seq A C B D ... Z --incorrect E B C M ... Z --incorrect ... Z Y X W ... A --full inverse icorrect 将掩码表处理为选择流作为插入结果后,预期输出到物理表:

id col1 col2 col3 col4 ... colN (auto- gnrtd) (null)(null)(null)(null)...(null) (null) C B (null)...(null) E (null)(null) M ...(null) ... Z Y X W ... A 请注意:字母仅作为示例。这里不是问题。需要SQL-Logic /命令。MINUS / EXCEPT的模拟量,但用于列(DISTINCT?如果传入的选择流是其他复杂的联合选择的结果,则如何?)

此任务的SQL代码是什么?请指教。

展开
收起
被纵养的懒猫 2019-10-09 17:01:37 454 分享 版权
阿里云 AI 助理回答

在SQL中,MINUS或EXCEPT操作符用于从第一个查询结果中排除第二个查询结果中的行,而不是列。如果你想要比较并排除基于列的数据,你可能需要采用不同的策略,比如使用CASE语句、窗口函数或者自连接来实现特定的逻辑。

根据你的描述,似乎你想找出掩码表中哪些列与传入选择流中的对应列数据不匹配,并将这些不匹配的列标识出来。这里是一个简化的示例,假设我们只处理两列col1col2,你可以扩展这个逻辑到更多的列。我们将使用自连接和CASE语句来实现这一需求:

SELECT 
  m.id,
  CASE WHEN m.col1 != s.col1 THEN m.col1 ELSE NULL END AS col1,
  CASE WHEN m.col2 != s.col2 THEN m.col2 ELSE NULL END AS col2,
  -- 重复此模式以涵盖所有列直到colN
FROM 
  mask_table m
CROSS JOIN 
  (SELECT col1, col2 FROM incoming_selection_stream) s
WHERE 
  m.col1 != s.col1 OR m.col2 != s.col2
  -- 添加更多列的条件,如果它们也需要被检查

这段SQL代码首先通过一个自连接(CROSS JOIN)将掩码表与传入的选择流进行配对,然后使用CASE语句检查每一对中的列值是否相等。如果不等,则保留掩码表中的值;如果相等,则输出NULL。最后,WHERE子句确保只有那些至少有一列不匹配的行才会被选中。

请注意,这种方法在列数很多时会变得非常冗长且效率低下。对于大量列的情况,你可能需要编写更复杂的动态SQL或者考虑使用存储过程来动态生成和执行查询。此外,如果数据量巨大,性能优化也将成为一个重要的考量因素。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
SQL
问答地址: