简体   繁体   English

在SQL中多次连接

[英]join multiple times in SQL

These are the 2 tables. 这些是2个表。 Tech_data: Tech_data:

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

Agent_table Agent_table

Id Name
1  Mike
2  John
3  Jim
4  Baron

I need to write a query to bring the below output 我需要编写一个查询以带来以下输出

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

I wrote LEFT OUTER JOIN ON tech_id=agent1_id, but i do not know how to join 2 ids in ON condition. 我在tech_id = agent1_id上写了LEFT OUTER JOIN ON,但是我不知道如何在ON条件下加入2个ID。

To prevent having to do multiple joins to the same table, you can unpivot, join and then pivot (then if you had 50 ID columns you would still only need to perform one join): 为了避免必须对同一张表进行多次联接,可以取消透视,联接然后进行透视(然后,如果您有50个ID列,则仍然只需要执行一次联接):

SQL Fiddle SQL小提琴

Oracle 11g R2 Schema Setup : 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;

Query 1 : 查询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 |

You can add a second left outer join just like the one you have used, on the same table by giving them different aliases as follows. 您可以在同一个表上添加第二个左外部联接,就像您使用的左外部联接一样,方法是为它们赋予不同的别名,如下所示。

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;

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM