2015-09-26 51 views
-1

对不起,对LONG的解释,但我不知道如何简单解释这个...我有一个表(table_animals),有一个名为Taxon的领域的动物科学名称。在表中的行看起来像这样(其中N是只是一个数字键):需要查询合并类似表格

N | Taxon | Parent | CommonName | Rank 
13 | Ursus-maritimus | Ursus | polar bear | 65 

学名有时会改变或正在重组,所以我相应地更新我的表。我首先创建了一个以当前科学名称为特色的新表(table_animals_new)。它只有两个领域,分类和排名...

N | Taxon | Rank 
9 | Ursus-maritimus | 65 

我现在想以某种方式结合这两个表在两个表中显示一切。

所以我们可以说这代表了旧数据(table_animals)...

N | Taxon | Parent | CommonName | Rank 
11 | Ursidae | Carnivora | bear family | 45 
12 | Ursus | Ursidae | typical bears | 55 
13 | Ursus-maritimus | Ursus | polar bear | 65 
14 | Ursus-blue | Ursus | blue bear | 65 

比较它在新表(table_animals_new)数据...

N | Taxon | Parent | CommonName | Rank 
8 | Ursinidae | Carnivora | bear family | 45 
9 | Ursus | Ursinidae | typical bears | 55 
10 | Ursus-maritimus | Ursus | polar bear | 65 
11 | Ursus-red | Ursus | red bear | 65 

在这个虚构的例如,蓝熊(Ursus-blue)不再被认为是一个物种,因此它不在新表中列出。然而,科学家们发现了一种新的物种 - 红色的熊(熊属红),这在旧表中没有列出。此外,熊现在被安置在Ursinidae家族,而不是熊科。

我想要做的是...

1)显示所有的新表(table_animals_new)

2)行显示的匹配行从旧表中的所有其他信息。因此,如果新表中有Taxon ='Ursus'的行,并且旧表也有Taxon ='Ursus'的行,那么旧表中与Ursus关联的字段(例如CommonName)也会显示。

3)显示“孤行行” - 旧表中与新表中的任何内容不匹配的行(例如Taxon ='Ursus-blue')。

4)以某种方式将孤立的行标记为“孤立的”。如果我有一张有5万行的表格,并且我看到一行Taxon ='red-blue',我不会对它来自哪个表格有任何线索。所以我想要一个额外的列,说“孤行”或“不孤立”(或NULL)。

还有一个选项,如果不是太困难,那将是非常酷的选择......标记出现在新表格中但不是旧表格的“新”。

所以成品表可能是这个样子:

N | Taxon | Parent | CommonName | Rank | Orphaned 
11 | Ursidae | Carnivora | bear family | 45 | orphan 
12 | Ursinidae | Carnivora | bear family | 45 | NEW 
13 | Ursus | Ursidae | typical bears | 55 | (NULL) 
14 | Ursus-maritimus | Ursus | polar bear | 65 | (NULL) 
15 | Ursus-blue | Ursus | blue bear | 65 | orphan 
16 | Ursus-red | Ursus | red bear | 65 | NEW 

我认为我可以在两个或三个操作做到这一点,但我想弄清楚如何只用一个查询做到这一点。下面是我想要做的更简单的例子。

旧表

Ç

d

新建表

d

Ë

合并显示

C(孤儿 - 在旧表只)

d

E(新 - 仅在新表)

+0

这就是所谓的'FULL OUTER JOIN' 。 MySQL没有这个功能。以下是如何模拟它:http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – Barmar

回答

1

我会建议使用一个联合查询。 你可以把它分解成3个疑问: - 同时存在于两个 这些记录 - 存在于表A仅 这些记录 - 存在于表B中这些记录只