2010-04-15 117 views
0

考虑我在三个表上使用连接来获得想要的结果集...Mysql加入 - 如何知道从哪个表检索哪一行...?

现在在那个结果集中,是否有无论如何,我可以找出哪一行来自哪个表......?

更新: 我看到我错误地表述了这个问题....正如下面的答案之一所指出的,由join返回的结果集可能会包含由多个talbe组成的列。 。

所以问题实际上应该是“考虑我使用的三个表工会得到期望的结果集...”

+1

您的意思是_union_? – 2010-04-15 10:21:01

回答

3

如果你问这个问题,那么你的数据库可能是不正确的结构。 (正确地是一个主观术语)。

规范化数据库上正确的SQL查询不应该依赖或不关心数据来自何处。

每行都是所有表的组合,空值插入到左/右/外连接的列中,这些列与连接标准不匹配。你也许可以测试一个列(来自一个特定的表)是否为空,并且从中得出非空值必须来自相反的表。

然后,如果您实际上正在执行UNION,正如Marcelo所建议的那样,您必须查看辅助列才能确定数据的来源,因为这些信息会在组合中丢失。

+0

+1为一个很好的答案.... 你能详细说明'辅助'列...?例如, – SpikETidE 2010-04-15 11:01:54

+0

,“origin”列包含来自表a的'1',来自表b的'2'以及来自表c的'3'。 – dar7yl 2010-04-15 11:34:03

+0

哦......刚才有这个想法我自己......但我想为id字符串添加一个额外的字符,并以这种方式来识别表......就像它是从tbl 1开始的,那么id将以a开头,如果tbl2然后b..etc ... – SpikETidE 2010-04-15 11:36:40

5

您可以将表标识列添加到每个:

select 'A' as table_name, col1, col2 from A 
union 
select 'B' as table_name, col1, col2 from B 
union 
... 

这将返回由你的应用程序作为任何普通的select语句来处理一个结果集:

while (rows available) { 
    row = fetchrow 
    if row.table_name == 'A' then 
    do special handling for table A 
    else if row.table_name == 'B' then 
    do special handling for table B 
    else if ... 

}

实际语法取决于您正在使用的语言,但大多数过程语言都遵循上面的方案。

+0

在结果集中引用这些行的语法是什么...? – SpikETidE 2010-04-15 11:23:57

+0

所有行显示为从单个表中选择。我在答案中增加了一个小节来说明如何处理这些问题。 – Martin 2010-04-15 11:42:58

+0

感谢您的建议..... +1让我学习一个新的技巧... – SpikETidE 2010-04-16 04:09:41

相关问题