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_1
和table_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 到特定字段的主要内容,如果未能解决你的问题,请参考以下文章