2017-01-31 90 views
1

我必须从3个表中选择数据。我使用第一个和第二个表之间的INNER JOIN从第二个表中获取另一个字段。但如果有不匹配,我有另1台field.I来取代它现在用下面的查询,但时间太长process.Is有另一种方式做到这一点替代联盟运营商

SELECT tba.field, tba.field1, tba.field2 AS test FROM tablea tba 
    WHERE tba.field NOT IN (SELECT ta.field FROM tablea ta INNER JOIN tableb tb ON ta.field = tb.field) 
UNION 
SELECT ta.field, ta.field1, tb.field2 AS test FROM tablea ta 
    INNER JOIN tableb tb ON ta.field = tb.field 
UNION 
SELECT tc.field, tc.field1, tc.field2 AS test FROM tablec tc 

SQL fiddle

+4

见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-看起来对我来说是一个非常简单的sql查询 - 并且注意关于查询性能的问题总是要求至少为所有相关表显示CREATE TABLE语句,说明。 – Strawberry

+0

你是否在使用子查询而不是第二个查询联合是相同的。为什么? –

+0

@strawberry我添加了链接。 – khalil

回答

0

这样的事情就够了:

SELECT tba.field, tba.field1, COALESCE(tb.field2, tba.field2) AS test 
FROM tablea tba 
LEFT OUTER JOIN tableb tb ON tba.field = tb.field 
UNION 
SELECT tc.field, tc.field1, tc.field2 AS test FROM tablec tc 
0

试试这个:这里是查询的替代方法,如果数据不重复,也可以使用UNION ALL而不是UNIONUNION ALL比较快

SELECT ta.field1, ta.field2, IFNULL(tb.field2, ta.field3) AS mytest 
FROM tablea ta 
LEFT JOIN tableb tb ON ta.field3 = tb.field1 
UNION ALL 
SELECT tc.field1, tc.field2, tc.field3 AS mytest FROM tablec tc