子查询在两个子集的连接时产生更多结果

时间:2012-04-20 02:47:23

标签: sql dataset left-join sas proc-sql

在两个表上执行左外连接语句后,我可能会收到更多ID。

上下文:我从较大的数据集中缩小了两个表。以下是从较大的数据集中选择后我用来获取ID的查询。我正在尝试根据personID加入两个数据集。我正在执行LEFT JOIN,因为我想保留smallerset表中的所有数据,同时将它与来自窄数据表的数据配对。

在对较大数据集的子集运行此查询时,我会收到以下ID:

select s.personID from st.smallerset as s;

41486
41490
41493
41496
 ...

现在,在运行第二个查询时,我收到以下内容:

select r.* from st.secondlargedataset as r,
st.condition as h where r.personID=h.personID group by r.personID;

我收到以下问题:

41544
41577
41595
41605
 ...

到目前为止,这么好。一切都如预期。但是,当我尝试连接这两个子集时运行下一个子查询时,我得到了意想不到的结果。

select s.personID
from st.smallerset as s left join
(select r.* from st.secondlargedataset as r,
 st.condition as h where r.personID=h.personID group by r.personID) as v on 
s.personID=v.personID;

41485
41486
41489
41490
41493
41496
41510
41512
41513
41516

此结果中包含的数据不包含在先前的查询中。具体为ID 414854148941496等。我无法理解这些ID出现的原因,因为当我将查询分解为单独的查询时,我得到了我需要的ID。

2 个答案:

答案 0 :(得分:1)

我认为您的问题可能来自此查询:

select r.*
from st.secondlargedataset as r, st.condition as h
where r.personID=h.personID
group by r.personID;

group by语句在大多数SQL实现中都是非法的,但SAS允许它(即使它没有意义),并产生不可预测的结果。

尝试删除它。

答案 1 :(得分:0)

尝试以下

SELECT s.personID FROM st.smallerset AS s WHERE s.personID IN ( SELECT r.personID FROM st.secondlargedataset AS r, st.condition AS h WHERE r.personID = h.personID GROUP BY r.personID )

OR

SELECT s.personID FROM st.smallerset AS s WHERE s.personID IN ( SELECT r.personID FROM st.secondlargedataset AS r INNER JOIN st.condition AS h ON r.personID = h.personID GROUP BY r.personID )