2015-04-07 53 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); 
相關問題