2016-07-25 12 views
1

我有一个模式,需要多次连接到同一个表以获取有关列指向的数据的更多信息。下面就是一个例子模式,它显示了这种情况:如何避免将多次加入同一个表中以将结果返回单行?

SQL小提琴:http://sqlfiddle.com/#!9/7a4019/1

CREATE TABLE STATE 
(
employee INT NOT NULL, 
boss INT, 
manager INT, 
rep INT 
); 

CREATE TABLE EMPLOYEE 
(
id INT NOT NULL, 
name VARCHAR(255) NOT NULL 
); 

INSERT INTO EMPLOYEE (id, name) VALUES (1, "Joe"); 
INSERT INTO EMPLOYEE (id, name) VALUES (2, "John"); 
INSERT INTO EMPLOYEE (id, name) VALUES (3, "Jack"); 
INSERT INTO EMPLOYEE (id, name) VALUES (4, "Jeff"); 
INSERT INTO EMPLOYEE (id, name) VALUES (5, "Jason"); 

INSERT INTO STATE (employee, boss, manager, rep) VALUES (1, 2, 3, 4); 
INSERT INTO STATE (employee, boss, manager, rep) VALUES (2, 3, 3, 4); 
INSERT INTO STATE (employee, boss, manager, rep) VALUES (3, NULL, NULL, 4); 
INSERT INTO STATE (employee, boss, manager, rep) VALUES (4, 3, 3, NULL); 
INSERT INTO STATE (employee, boss, manager, rep) VALUES (5, 2, 3, 4); 

目前,我知道拿到单排为每位员工信息的唯一途径,是左侧的接合部多次这样的:

SELECT employee, b.name AS boss, m.name AS manager, r.name AS rep 
FROM STATE 
LEFT JOIN EMPLOYEE b ON b.employee = STATE.boss 
LEFT JOIN EMPLOYEE m ON m.employee = STATE.manager 
LEFT JOIN EMPLOYEE r ON r.employee = STATE.rep 

有没有办法做到没有连接和没有子查询?

+1

是否有一个原因可以避免JOIN操作? –

+0

@OllieJones只希望有更快的东西 –

回答

2

你问:

有没有办法做到这一点无需连接和无子查询?

不是。您正在使用JOIN操作,因为它们打算用于它们 - 每个JOIN都反映了表格各行之间的特定关系。

0

您可以避免使用聚合函数进行多个连接,这些函数最近在达到MySQL/MariaDB查询中可以完成的连接数限制(61)之后发现很有用。

SELECT s.employee, 
     GROUP_CONCAT(if(e.id=s.boss, name, NULL)) as boss, 
     GROUP_CONCAT(if(e.id=s.manager, name, NULL)) as manager, 
     GROUP_CONCAT(if(e.id=s.rep, name, NULL)) as rep, 
FROM STATE s, EMPLOYEE e 
GROUP BY s.employee 

上面的例子使用MySQL的GROUP_CONCAT函数。它似乎不是ANSI标准。其他关系数据库可能具有相似的功能。粗略的网络搜索发现了一个讨论各种关系数据库的聚合函数的页面:http://www.postgresonline.com/journal/archives/191-String-Aggregation-in-PostgreSQL,-SQL-Server,-and-MySQL.html

相关问题