如果同一个字符串在 Table_1 中作为首字母缩写词出现,在 Table_2 中作为 user_pk 出现,是否可以公平地猜测,如果其中一个名称完全为空,您不想看到它,但如果任一名称字段中的任何一个row 不为空,您宁愿看到两行而不是一行?
在这个假设上工作:
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”是主键(非空且唯一),也没有指定“首字母缩写词”是主键。这些细节可能会有所帮助,并且可以消除回答您问题的人的一些担忧(即使他们没有表达过担忧)。这也让我们放心,你知道你在说什么。