在SQL中连接多次

时间:2017-11-13 23:18:33

标签: sql oracle

这是2个表格。 Tech_data:

Id Tech Agent1_id Agent2_ID
1  JAVA   1           2   
2  SQL    3           4

Agent_table

Id Name
1  Mike
2  John
3  Jim
4  Baron

我需要编写一个查询来获得以下输出

TECH_ID   Tech  Agent1_Name Agent2_Name
1         Java    Mike       John
2         SQL     Jim        Baron

我在tech_id = agent1_id上写了LEFT OUTER JOIN,但我不知道如何在ON条件下加入2个ID。

2 个答案:

答案 0 :(得分:3)

为了防止必须对同一个表进行多次连接,您可以取消注册,加入然后转动(如果您有50个ID列,您仍然只需要执行一次连接):

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE Tech_data (Id, Tech, Agent1_id, Agent2_ID ) AS
SELECT 1,  'JAVA', 1, 2 FROM DUAL UNION ALL
SELECT 2,  'SQL',  3, 4 FROM DUAL;

CREATE TABLE Agent_table ( Id, Name ) AS
SELECT 1,  'Mike' FROM DUAL UNION ALL
SELECT 2,  'John' FROM DUAL UNION ALL
SELECT 3,  'Jim' FROM DUAL UNION ALL
SELECT 4,  'Baron' FROM DUAL;

查询1

SELECT *
FROM   (
  SELECT t.id,
         t.tech,
         t.num,
         a.name
  FROM   (
      SELECT *
      FROM   tech_data
      UNPIVOT ( Agent_ID FOR num IN ( Agent1_id AS 1, Agent2_id AS 2 ) )
    ) t
    INNER JOIN Agent_table a
    ON ( t.agent_id = a.id )
)
PIVOT ( MAX( name ) FOR num IN ( 1 AS Agent1_Name, 2 AS Agent2_Name ) )

<强> Results

| ID | TECH | AGENT1_NAME | AGENT2_NAME |
|----|------|-------------|-------------|
|  1 | JAVA |        Mike |        John |
|  2 |  SQL |         Jim |       Baron |

答案 1 :(得分:1)

您可以在同一个表上添加第二个左外连接,就像您使用的那个一样,为它们提供不同的别名,如下所示。

select t.Id tech_id, t.tech, a1.name, a2.name
from tech_data t
left outer join agent_table a1 on a1.Id = t.agent1_id
left outer join agent_table a2 on a2.Id = t.agent2_Id;

检查下面的小提琴: http://sqlfiddle.com/#!4/73f02b/1