【问题标题】:How to select rows based on join on two columns of same table如何根据连接在同一张表的两列上选择行
【发布时间】:2015-02-07 02:33:59
【问题描述】:

对不起,如果标题不是很容易理解,请随时编辑。 我有一个名为 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... 如果您知道如何比我更好地解释问题,请随时编辑问题。

提前谢谢你。

【问题讨论】:

  • 我已经编辑了主题标题。希望现在更有意义。

标签: sql oracle select join self-join


【解决方案1】:
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 值的逻辑。

【讨论】:

    【解决方案2】:

    SELF JOIN 将解决您的问题。

    试试这个:

    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;
    

    编辑

    如果您在 OTHER_ID 列中有 NULL 值,则使用 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;
    

    【讨论】:

    • 谢谢,效果很好。但是如果我在 OTHER_ID 字段中有一个空值,它会起作用吗?
    • 否,如果值为 NULL,则当前查询将不起作用。因为,NULL 是一个三值逻辑。您需要使用 outer join 来包含行。或者,提供如何处理 NULL 值的逻辑。
    【解决方案3】:

    试试这个:

    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)
    

    (好像来晚了,抱歉)

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多