如何基于同一表的两列上的连接选择行

时间:2014-12-09 09:01:29

标签: sql oracle select join self-join

很抱歉,如果标题不是真的可以理解,请随时编辑。 我有一个名为CLIENT的表,这是一个数据样本:

ID_CLIENT   CLIENT_NAME     OTHER_ID    
----------------------------------------
1           'COMPANY A'     1   
2           'COMPANY B'     4
3           'COMPANY C'     3   
4           'COMPANY D'     1

我想创建一个获取CLIENT_NAME而不是OTHER_ID的查询。 这真的很难解释,这是我希望用我的查询看到的结果:

ID_CLIENT   CLIENT_NAME     CLIENT_BRANCH
--------------------------------------------
1           'COMPANY A'     'COMPANY A' 
2           'COMPANY B'     'COMPANY D'
3           'COMPANY C'     'COMPANY C' 
4           'COMPANY D'     'COMPANY A'

我想将OTHER_ID“链接”到相关的CLIENT_NAME ... 如果您知道如何比我更好地解释它,请随时编辑问题。

提前谢谢。

3 个答案:

答案 0 :(得分:4)

自我加入将解决您的问题。

试试这个:

SELECT C1.ID_CLIENT, C1.CLIENT_NAME, C2.CLIENT_NAME CLIENT_BRANCH 
FROM CLIENT C1 
INNER JOIN CLIENT C2 ON C1.OTHER_ID = C2.ID_CLIENT;

修改

如果您在NULL列中有OTHER_ID值,请使用 LEFT JOIN 代替 INNER JOIN

SELECT C1.ID_CLIENT, C1.CLIENT_NAME, C2.CLIENT_NAME CLIENT_BRANCH 
FROM CLIENT C1 
LEFT JOIN CLIENT C2 ON C1.OTHER_ID = C2.ID_CLIENT;

答案 1 :(得分:0)

试试这个:

select a.client_id, a.client_name, b.client_name as client_branch
from client a join client b on (a.other_id = b.client_id)

(好像我已经太晚了,抱歉)

答案 2 :(得分:0)

SELECT     a.id_client, 
           a.client_name, 
           b.client_name AS "client_branch" 
FROM       client a 
INNER JOIN client b 
ON        (a.other_id = b.id_client)
/

阅读有关JOINS的文档。关于SELF JOINS的文档的几个例子。

编辑:关于NULL值

在关于JOINS的相同链接中,请阅读OUTER JOINS。因为NULL是三值逻辑,所以它既不等于NULL也不等于NULL。您需要使用outer join来包含在NULL情况下不匹配的行。或者,提供一个如何处理NULL值的逻辑。