2015-04-07 59 views
0

我有两个查询是大多是简单的选择语句,这是不相关的,但都返回相同数量的行。选择获得两个不同的查询结果与1列作为一个结果与2列

SQL> select first_name from employees where rownum <=3; 
FIRST_NAME 
-------------------- 
Ellen 
Sundar 
Mozhe 

SQL> select department_name from departments where rownum <=3; 

DEPARTMENT_NAME 
------------------------------ 
Administration 
Marketing 
Purchasing 

我想无论是sql语句为1个选择查询返回两个SELECT语句的值1分的结果有2列(每个select语句)

FIRST_NAME  DEPARTMENT_NAME 
-------------- ------------------ 
Ellen   Administration 
Sundar   Marketing 
Mozhe   Purchasing 

这里的结果的结果是我尝试过,但我得到的结果重复

select first_name, department_name from 
(select first_name from employees where rownum <=5), 
(select department_name from departments where rownum <=5); 

with q1 as (select first_name from employees where rownum <=5), 
q2 as (select department_name from departments where rownum <=5) 
select first_name, department_name from q1, q2; 

这给

FIRST_NAME   DEPARTMENT_NAME 
-------------------- ------------------- 
Ellen    Administration 
Sundar    Administration 
Mozhe    Administration 
David    Administration 
Hermann    Administration 
Ellen    Marketing 
Sundar    Marketing 
Mozhe    Marketing 
David    Marketing 
Hermann    Marketing 
Ellen    Purchasing 
Sundar    Purchasing 
Mozhe    Purchasing 
David    Purchasing 
Hermann    Purchasing 
Ellen    Human Resources 
Sundar    Human Resources 
Mozhe    Human Resources 
David    Human Resources 
Hermann    Human Resources 
Ellen    Shipping 
Sundar    Shipping 
Mozhe    Shipping 
David    Shipping 
Hermann    Shipping 

请帮助。

回答

1

你可以这样做:

WITH indexed_employees AS (
    SELECT rownum AS idx, 
     first_name 
    FROM employees 
    WHERE rownum <=3 
), 
indexed_departments AS (
    SELECT rownum AS idx, 
     department_name 
    FROM departments 
    WHERE rownum <=3 
) 
SELECT e.first_name, 
     d.department_name 
FROM indexed_employees e 
     INNER JOIN 
     indexed_departments d 
     ON(e.idx = d.idx) 
ORDER BY e.idx 

然而,这并没有太大的以这种方式连接两个字段的合成意义,因为它们不相关。

如果您只是想减少往返数据库的次数,则可以使用存储过程来返回两个游标(每个查询一个)。

CREATE PROCEDURE get_Top_Emps_and_Depts(
    out_employees_cursor  OUT SYS_REFCURSOR, 
    out_departments_cursor OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    OPEN out_employees_cursor FOR 
    SELECT first_name 
    FROM employees 
    WHERE rownum <=3; 

    OPEN out_departments_cursor FOR 
    SELECT department_name 
    FROM departments 
    WHERE rownum <=3; 
END get_Top_Emps_and_Depts; 
/
0

你必须首先以某种方式来枚举行,例如用rownum,然后使用该密钥加入他们的行列:

with q1 as (select rownum rn, first_name from employees where rownum <=5), 
q2 as (select rownum rn, department_name from departments where rownum <=5) 
select first_name, department_name from q1 join q2 using (rn); 
相关问题