SQL加入/联合帮助 - 将表b和c链接到表a?

时间:2011-03-02 16:03:37

标签: sql join union

我的数据库中有3个表。他们每个人都有一列,“索引”,链接所有3个字段。

我们的出发点是表a,以及其中的索引。如果索引不存在,我不需要它。

表b和c非常相似,表a中列出的每个索引都在b或c中,或两者都有。我需要做的就是确保表a中的所有字段都连接到表b或c中的字段。

我开始时:

SELECT * 
FROM `table_a` 
JOIN table_b ON table_a.index = table_b.index

哪个效果很好。但它会排除表a中所有不匹配的索引,这就是为什么我相信,当我添加:

UNION
FROM `table_a` 
JOIN table_c ON table_a.index = table_c.index

我实际上得到的结果不多,而不是更多。

有人可以告诉我怎么说“如果索引不在表b中,那么查看表c?”

3 个答案:

答案 0 :(得分:1)

我不确定这是你所追求的,但它会给你所有的结果,以及来自b OR c的任何可能的匹配。

SELECT *
FROM table_a
   LEFT OUTER JOIN table_b ON table_a.index = table_b.index
   LEFT OUTER JOIN table_c ON table_a.index = table_c.index

答案 1 :(得分:0)

您是否尝试过“全联盟”?

SELECT * 
FROM `table_a` 
JOIN table_b ON table_a.index = table_b.index
UNION ALL
SELECT * 
FROM `table_a` 
JOIN table_c ON table_a.index = table_c.index

答案 2 :(得分:0)

第一步:

SELECT * FROM
table_a
LEFT JOIN table_b ON table_a.index = table_b.index
LEFT JOIN table_c ON table_b.index = table_c.index

这将获得所有3个表中的所有索引。

如果你想从表_a,_b或_c中得到第一个非NULL的索引,你可以在MySQL中这样做:

SELECT COALESCE(table_a.index, table_b.index, table_c.index) AS firstIndexFromABC
FROM
table_a
LEFT JOIN table_b ON table_a.index = table_b.index
LEFT JOIN table_c ON table_b.index = table_c.index

或者你使用的是什么数据库? 更新: MySQL

一些评论后

更新

抱歉,我仍然没有得到它。这就是COALESCE方法的作用。你得到1列,如果它在那里,你会得到b,如果没有你得到b,如果它在那里,如果不是你得到c。

如果你的意思是,你想要的信息,你从哪个表中获取索引,那么试试这个:

SELECT COALESCE(table_a.index, table_b.index, table_c.index) AS firstIndexFromABC, 
CASE WHEN table_a.index IS NULL AND table_b.index IS NULL THEN 'c'
    WHEN table_a.index IS NULL AND table_b.index IS NOT NULL THEN 'b'
    WHEN table_a.index IS NOT NULL THEN 'a'
END AS whichTable
FROM
table_a
LEFT JOIN table_b ON table_a.index = table_b.index
LEFT JOIN table_c ON table_b.index = table_c.index