2011-05-12 34 views
9

我可以用两个请求完成我想要的操作,但我只想用一个请求来完成。只有在字段不为空的情况下才能进行内部加入

其实,我有4个表有:

Table 1 : id, sub-id 
Table 2 : id, sub-id 
Table 3 : id, login 
Table 4 : id, login 

我作出这样的请求:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
    Table3.login, Table4.login FROM Table1 
    INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id) 
    INNER JOIN Table3 ON (Table3.id = Table1.id) 
    INNER JOIN Table4 ON (Table4.id = Table1.id) 
    WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid" 

我想加入Table3只有id不为空,如果是空的,我加入Table4

你有什么想法吗?

我听说左连接可以提供帮助,但我并不习惯这些关键字,所以......?

+0

如果你可以保证表3和表4中的id不相等,那么上面的查询就没问题。否则,您需要查看我认为的动态SQL路由。 – anothershrubery 2011-05-12 14:29:16

+0

[SQL加入的视觉解释](http://www.codinghorror.com/blog/archives/000976.html) – 2011-05-12 14:29:44

回答

7

就像在其他答案中说的,你可以使用左连接。您还可以添加case statement到只有一个login列:

SELECT 
    Table1.id, 
    Table1.sub-id, 
    Table2.id, 
    Table2.sub-id, 
    CASE 
     WHEN Table3.id IS NOT NULL THEN Table3.login 
     ELSE Table4.login 
    END CASE AS login 
FROM Table1 
INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id) 
LEFT JOIN Table3 ON (Table3.id = Table1.id) 
LEFT JOIN Table4 ON (Table4.id = Table1.id) 
WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid" 
+2

'COALESCE(Table3.login,Table4.login)'给出与'CASE ... END CASE'完全相同的结果。 – 2011-05-12 14:47:35

+0

@ypercube在这个精确的情况下,我们可以假设是的,但是由于条件在'id'列,我们想要'login'列,它不完全等价,有些情况下结果不会是相同。 – krtek 2011-05-12 16:28:16

2

这可能帮助:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
    Table3.login, Table4.login FROM Table1 
    INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id) 
    LEFT JOIN Table3 ON (Table3.id = Table1.id) 
    LEFT JOIN Table4 ON (Table4.id = Table1.id) 
    WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid" 
+0

其实它帮助:) – Sumz 2011-05-12 14:38:57

4

使用左连接:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
Table3.login, Table4.login FROM Table1 
INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id) 
LEFT JOIN Table3 ON (Table3.id = Table1.id) 
LEFT JOIN Table4 ON (Table4.id = Table1.id) 
WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid" 

然后,从表3和表4的行会,如果有匹配在一起。否则,这些将是NULL。然后您可以检查结果并使用来自Table3(如果存在)的数据,否则使用Table4。

2

尝试这样:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
    COALESCE(Table3.login, Table4.login) AS login 
FROM Table1 
INNER JOIN Table2 ON Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id 
LEFT JOIN Table3 ON Table3.id = Table1.id 
LEFT JOIN Table4 ON Table4.id = Table1.id 
WHERE Table1.id = 'my_id' AND Table1.sub-id = 'my_subid' 

我已经删除unnecesary parethensis以减少混乱。另请注意,SQL中的标准字符串分隔符是单引号。

+0

啊,打字速度更快。 – 2011-05-12 14:37:02

+0

@ypercube - 对我不常用:) – 2011-05-12 14:49:06

2

如果出于任何table1.id或者只table3.id或仅table4.id将匹配,您可以使用此:

SELECT 
    Table1.id 
    , Table1.sub-id 
    , Table2.id 
    , Table2.sub-id 
    , COALESCE(Table3.login, Table4.login) 
    AS login 

FROM Table1 
    INNER JOIN 
    Table2 ON (Table1.id = Table2.id 
      AND Table1.sub-id = Table2.sub-id) 
    LEFT JOIN 
    Table3 ON (Table3.id = Table1.id) 
    LEFT JOIN 
    Table4 ON (Table4.id = Table1.id) 

WHERE Table1.id = "my_id" 
    AND Table1.sub-id = "my_subid" 
+0

Thank you :) that worked – Sumz 2011-05-12 14:39:54

+0

@LostInJoin:你可以接受Alvaro的回答。这和我的一样,他首先发布。 – 2011-05-12 14:42:43

相关问题