2011-05-12 81 views
1

我的理解是,IN就像是一個布爾函數,爲每個實例返回一個值,當使用IN時,外部查詢返回true。因此,結果集不應該只有外部查詢的行數?SQL的工作難點IN

表1:

DNUMBER DLOCATION 
---------- --------------- 
     1 Houston 
     4 Stafford 
     5 Bellaire 
     5 Houston 
     5 Sugarland 

表2:

DNAME     DNUMBER 
-------------------- ---------- 
Research      5 
Administration    4 
Headquarters     1 

所以不應該這個查詢只能返回3行?

SELECT D.dname, DL.dlocation 
FROM department D, dept_locations DL 
WHERE D.dnumber IN 
(SELECT dnumber FROM dept_locations) 

結果:

DNAME    DLOCATION 
-------------------- ------------- 
Headquarters   Houston 
Administration  Houston 
Research    Houston 
Headquarters   Stafford 
Administration  Stafford 
Research    Stafford 
Headquarters   Bellaire 
Administration  Bellaire 
Research    Bellaire 
Headquarters   Houston 
Administration  Houston 
Research    Houston 
Headquarters   Sugarland 
Administration  Sugarland 
Research    Sugarland 
+0

我n的工作方式類似於一系列排序,所以你基本上說「這個數組中存在D.數量(5,4,1)」 – Robert 2011-05-12 19:14:19

回答

0
SELECT D.dname 
    , GROUP_CONCAT(DL.dlocation) 
    FROM department AS D 
INNER 
    JOIN dept_locations AS DL 
    ON D.dnumber = DL.dnumber 
GROUP 
    BY D.dname; 

我做幾個假設,但我認爲這將返回你想獲取數據。它會抓住每種類型(研究等)以及逗號分隔的位置列表。

你的查詢根本不需要子查詢,只需要一個適當的連接條件。

1
SELECT D.dname, DL.dlocation 
FROM department D, dept_locations DL 
WHERE D.dnumber IN 
(SELECT dnumber FROM dept_locations) 

沒有加入標準(顯式或隱式的)限制行以任何方式被匹配,所以執行一個交叉聯接(全部在左邊用行右側的行的組合)。

1

您對IN的理解是正確的。你獲得更多行的原因是因爲你的主要查詢是從2個表中選擇的,並且對第二個表沒有限制。這個查詢只能返回3行:

SELECT D.dname 
FROM department D 
WHERE D.dnumber IN 
(SELECT dnumber FROM dept_locations) 

但是,當然,你會失去你的位置。通過添加dept_locationsFROM條款,你基本上是交叉連接表,你也不會限制行從第二個表中返回與WHERE條款,你唯一的限制行從department

要使用當前的查詢格式返回正確限制行,你可以這樣做:

SELECT D.dname, DL.dlocation 
FROM department D, dept_locations DL 
WHERE D.dnumber IN 
(SELECT dnumber FROM dept_locations) 
AND DL.dnumber = D.dnumber 

但要得到你想要的數據的最佳方式可能是使用一個JOIN這裏:

SELECT D.dname, DL.dlocation 
FROM department D 
JOIN dept_locations DL on DL.dnumber = D.dnumber