2013-04-29 70 views
1

您好我想转换下面的子查询,只是使用连接,但在转换中有一些问题,结果得到过滤不正确。需要帮助来找出问题或加入正确的查询。子查询Sql工作正常。转换sql子查询加入

SELECT ev1.eventgender,ev1.distance,ev1.style FROM events ev1 
JOIN results re1 ON ev1.eventid = re1.eventid 
JOIN competitors cm1 on re1.competitornum = cm1.competitornum 
WHERE cm1.countrycode = 'AUS' 
AND ev1.eventid NOT In (SELECT ev2.eventid FROM events ev2 
         JOIN results re2 ON ev2.eventid = re2.eventid 
         JOIN Competitors cm2 ON re2.competitornum = cm2.competitornum 
         WHERE cm2.countrycode = 'AUS' 
         AND re2.place IN (1,2,3)) 

我曾尝试以下查询,但结果不正确

SELECT ev1.eventgender,ev1.distance,ev1.style FROM events ev1 
LEFT OUTER JOIN results re1 
    ON ev1.eventid = re1.eventid 
    AND re1.place Not in (1,2,3) 
JOIN Competitors cm1 ON re1.competitornum = cm1.competitornum 
AND cm1.countrycode = 'AUS' 
WHERE ev1.eventid IS NOT NULL 
ORDER by ev1.eventgender, ev1.style 

实际结果

enter image description here

预期结果

enter image description here

+1

你在使用 – 2013-04-29 15:32:37

+0

我使用MySQL的 – 2013-04-29 15:38:29

+1

@Evan请详细RDBMS - 为什么你认为这两件事情有什么不同? – 2013-04-29 15:41:03

回答

0

您的子查询不相关,因此您可以将其直接移至from子句。加入它使用left outer joinwhere子句中检查是否有匹配:

SELECT ev1.eventgender, ev1.distance, ev1.style 
FROM events ev1 JOIN 
    results re1 
    ON ev1.eventid = re1.eventid JOIN 
    competitors cm1 
    on re1.competitornum = cm1.competitornum left outer join 
    (SELECT ev2.eventid 
     FROM events ev2 JOIN 
      results re2 
      ON ev2.eventid = re2.eventid JOIN 
      Competitors cm2 
      ON re2.competitornum = cm2.competitornum 
     WHERE cm2.countrycode = 'AUS' AND re2.place IN (1,2,3) 
    ) 
    on ev1.eventid = ev2.eventid 
WHERE cm1.countrycode = 'AUS' and ev2.eventid is null