UNION 到特定字段

Posted

技术标签:

【中文标题】UNION 到特定字段【英文标题】:UNION to specific field 【发布时间】:2012-04-06 19:33:24 【问题描述】:

谁能帮我更改我的 SQL 查询,以便“UNION”语句将仅应用于字段“首字母缩略词”和“user_pk”(而不适用于字段“姓,名;姓,名” )?但在“parent”“SELECT”语句中,“acronym”、“surname”和“givename”字段应该仍然存在。

SELECT acronym, surname, givename
FROM
(
    SELECT acronym, surname, givename from table_1
    UNION
    SELECT user_pk, lastname, firstname  from table_2
)

感谢您的支持!

亲切的问候,嘘

【问题讨论】:

“UNION 仅适用于“首字母缩略词”和“user_pk”是什么意思?如果您指的是重复消除,这是否意味着您需要为每个不同的首字母缩写词或 user_pk 输入一个条目,然后再加入相关表以收集相关数据? yipes - 看起来很奇怪......你想做什么?似乎 JOIN 是您真正想要的 - 但很难说。 那......不是UNION 的工作原理。 你的目标是什么?请提供来自table_1table_2 的示例行,并提供所需输出的示例。 对不起我的问题!我用一张图片更新了它,它应该向您展示我想要实现的目标。 【参考方案1】:

如果同一个字符串在 Table_1 中作为首字母缩写词出现,在 Table_2 中作为 user_pk 出现,是否可以公平地猜测,如果其中一个名称完全为空,您不想看到它,但如果其中一个名称任一行中的字段都不为空,您宁愿看到两行而不是一行?

基于这个假设:

SELECT t1.acronym, t1.surname, t1.givename
  FROM table_1 AS t1
 WHERE t1.surname IS NOT NULL OR t1.givename IS NOT NULL
UNION
SELECT t2.user_pk AS acronym, t2.lastname AS surname, t2.firstname AS givename
  FROM table_2 AS t2
 WHERE t2.lastname IS NOT NULL OR t2.firstname IS NOT NULL

如果这与您想要的不够接近,请从下表中提供所需的输出:

Table_1
Acronym          Surname      Givename
Denton Powell     Powell        Denton
Jane Goodall     Goodall
Susan Mitchell                   Susan
Martin Catcall
John Thimble     Thimble          John

Table_2
User_pk        Lastname      Firstname
Denton Powell
Jane Goodall                      Jane
Susan Mitchel   Mitchell
Martin Catcall   CatCall         Marty
John Thimble      Needle         David

还有更多可能的组合,但是当您指定了您想要的组合时,您将已经详细介绍了大多数情况,其他情况应该是显而易见的。


回答主要问题的评论

我只想查看一行,因为这个“user_pk”已经存在于 table_1 中(在字段“首字母缩写词”中)。在您的情况下,输出应该是: Denton Powell;鲍威尔;丹顿。 table_2 中的行应该被忽略。

再解释一下,这意味着如果表项出现在Table_1中,则使用它;如果 Table_2 中没有匹配的条目,则仅使用 Table_2 中的条目?

再次,根据这个假设,然后您希望将 Table_1 中的数据与“Table_2 与 Table_1 的半连接的补码”合并,这是一种花哨的说法,即“Table_2 中的行在 Table_1' 中没有条目:

SELECT t1.acronym, t1.surname, t1.givename
  FROM table_1 AS t1
UNION
SELECT t2.user_pk AS acronym, t2.lastname AS surname, t2.firstname AS givename
  FROM table_2 AS t2
 WHERE t2.user_pk NOT IN (SELECT t1a.acronym FROM table_1 AS t1a);

这失去了名称中的空值条件。如果某个用户在 Table_1 中有一个条目,而姓氏和名字字段中没有任何信息,那么您将看到这些空名称。如果您要应用其他条件,则必须稍作调整。

顺便说一句,我认为您从未指定“user_pk”是主键(非空且唯一),也没有指定“首字母缩写词”是主键。这些细节可能会有所帮助,并且可以消除回答您问题的人的一些担忧(即使他们没有表达过担忧)。这也让我们放心,您知道自己在说什么。

【讨论】:

非常感谢!您帖子中的第二个 SQL 查询是我想要的解决方案。【参考方案2】:
SELECT acronym as col, surname, givename from table_1
UNION
SELECT user_pk as col, lastname as surname, firstname as givename from table_2

【讨论】:

对于大多数意图和目的而言,这与原始查询不一样吗?您已将输出中的“首字母缩略词”重命名为“col”,并且您没有使用嵌套的 SELECT 表示法,但除此之外......相同吗? 是的,完全一样,但它有效,试试吧!有时解决方案真的很简单:D 它“有效”,如“产生与原始答案相同的错误答案”?或者它是否以某种方式产生了正确答案,就像(稍微)修改过的问题一样? 嗯,好的,我现在看到您修改了更具体的问题。我更新答案。您可以在首字母缩写词和 user_pk 中使用相同的名称吗?所以你还需要删除结果中的重复行?

以上是关于UNION 到特定字段的主要内容,如果未能解决你的问题,请参考以下文章

union连接的两个表的字段必须完全相同吗?

oracle中怎么将union all的字段值加在一起

mysql_DML_select_union

MySQL:向 UNION 查询添加标识字段

具有所有字段名称和名称不存在的空值的 UNION

union all ,union 注意事项,查询结果集中的字段名称顺序必须一致