0

假设我有十个用户数据表(在 10 个不同的系统中),并且任何用户都可以在这 10 个表中的零个或多个表中拥有记录。

连接查询会合并来自所有 10 个表的数据,这样它会生成一个结果集,每个用户一行,所有 10 个表中的列。对于每个用户的记录,没有该用户数据的表的列将为空。

我遇到的问题是,在用户名上对表 1 (t1) 和表 2 (t2) 执行完全联接后,我留下了一个结果集,其中 t1.Username 或 t2.Username 可能为空(对于例如,如果用户仅在 t1 中有记录,但在 t2 中没有记录,反之亦然)。由于任一用户名都可能为空,因此我应该将哪个用户名字段与 t3(和后续表)连接,而无需编写带有“或”条件的复杂“on”子句。

恐怕要干净地做到这一点的唯一方法是在每次加入后合并用户名,并将每个后续表加入到前面结果集的合并用户名字段中。

我的第一个选择如下所示:

select coalesce(t1.username,t2.username) as U2, t1.*, t2.*
from t1 full outer join t2 on t1.Username = t2.Username

然后我必须将 t3 加入 t3.Username = U2 上的结果集。但是,在我加入 t4 之前,我必须合并 t3.Username 和 U2 以获得 U3,所以我可以在 U3 上加入 t4.Username,依此类推。这似乎要求第一个 select 语句是查询中的子查询,该查询选择新的合并用户名,对于每个附加表,依此类推。查询的最终形式似乎必然是一系列嵌套的子查询。这是必须的,还是有其他方法可以做到这一点?

我不想做的是针对一个唯一用户名列表的一系列左连接,我通过合并所有 10 个表的用户名预先生成该列表。虽然这会起作用并且是一个非常干净的单级查询,但这 10 个表中的每一个的生成都是昂贵的,所以我不想预先生成它们只是为了像这里的答案一样提取唯一的用户名:https: //stackoverflow.com/a/9233478/88409

我还在这里看到了另一个讨论:http ://www.listserv.uga.edu/cgi-bin/wa?A2=ind1110b&L=sas-l&P=1445 ,它显示了 4 个不同版本的如何完成(其中第一个避免子查询),但它在 where 子句中使用合并,随着每个附加表的大小增加。

4

1 回答 1

0

将 10 个集合中的每一个生成一个表变量(基本上是一个缓存)。然后在表变量上使用其他问题中的技术。我建议在每个表变量上声明一个主键,以便更快地合并它们。

于 2013-03-06T01:52:45.920 回答