2016-08-19 77 views
-1

我有兩個表這樣選擇全部使用SQL子查詢

create table department(
Dno int primary key, 
name varchar(50) not null 
) 


create table employee(
empid int primary key, 
name varchar(50) not null, 
sal decimal(7,2) not null, 
dno int foreign key references department(Dno)) 

我想使用SQL子查詢以下查詢的結果相同。

SELECT e.Name, e.Sal, d.Dno, d.Name 
FROM Employee e, 
    Department d 
WHERE e.Dno = d.Dno 
    AND e.name = 'aa' 

以下是我試過的。

SELECT Name, Sal 
FROM Employee 
WHERE Name= 'aa' AND Dno IN 
    (SELECT Dno, name 
    FROM Department) 

這給出了以下錯誤。

當未通過EXISTS引入 子查詢時,只能在選擇列表中指定一個表達式。

+2

只要在子查詢中選擇dno from department',不需要選擇名稱列 – Petaflop

+0

@msanz如果我想使用子查詢顯示所有這兩個表,我該怎麼辦? –

+0

檢查我的回答低於 – Petaflop

回答

1

您的子查詢應該只選擇一個列並返回一個列表。

SELECT Name, Sal 
FROM Employee 
WHERE Name= 'aa' AND Dno IN 
    (SELECT Dno FROM Department) 

在另一方面,你無法通過使一個子查詢得到Department列到結果。

達到你想要得到什麼,最好的辦法是通過連接表:

SELECT e.Name, e.Sal, d.Dno, d.Name 
FROM Employee e 
INNER JOIN Department d ON e.Dno = d.Dno 
WHERE e.name = 'aa' 
+0

如果我想使用子查詢顯示所有這兩個表,我該怎麼辦? –

+2

@NilaniAlgiriyage你不能。子查詢不是爲此目的而設計的。你需要做你現在正在做的事情,或者只是'JOIN'兩個表 – Petaflop

+0

非常感謝你 –

0

你不能把兩列的子查詢

SELECT Name, Sal 
FROM Employee 
WHERE Name= 'aa' AND Dno IN 
    (SELECT Dno 
     FROM Department) 
+0

如果我想使用子查詢顯示所有的兩個表,我該怎麼辦? –

1
SELECT Name, Sal 
FROM Employee 
WHERE Name= 'aa' AND Dno IN 
    (SELECT Dno 
     FROM Department) 

您需要刪除子查詢中的名稱。執行查詢時,請考慮子查詢接收到的每個值將與「主」查詢的值進行比較。

如果您有員工

ID Name Sal Dno 
1 Bob 3000  3 
2 Alice 3000  2 

以下記錄和處以下記錄

Dno Name   
1 Advertisement 
2 Programming 
3 Analysement 

你當然無法比擬的鮑勃值3 {3} Analysement 。子查詢通常用於過濾行,而不是像連接可以顯示的那樣顯示額外的值。

+0

非常感謝 –

0

更好地使用'EXISTS'而不是'IN'從句。這裏是腳本

SELECT Name, Sal 
FROM Employee e 
WHERE Name= 'aa' 
    AND EXISTS (SELECT 1 FROM Department d WHERE e.Dno=d.Dno) 
1

子查詢可用於從多個RELATED表中獲取數據。 它不能用於連接兩個表。 如果你想顯示多個表,你必須使用JOIN或UNION。