2011-05-12 75 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