不使用子查询的SQL查询

时间:2011-07-18 14:31:29

标签: mysql sql subquery

不久前我来到这个网站试图找到一个查询,最后得到了这个。它的作用以及我需要它做的是查看表'数据'并返回任何已经在两个不同diagnosis_locations处理的客户的名字,姓氏和出生日期。它有效。

  SELECT firstname, lastname, date_of_birth
    FROM `data`
   WHERE diagnosis_location IN (SELECT DISTINCT Diagnosis_location 
                                  FROM `data`)
GROUP BY firstname, lastname, date_of_birth
  HAVING COUNT(DISTINCT diagnosis_location) >= 2

但是,现在我需要使用相同的查询并获得相同的结果而不使用任何子查询。谁能在这帮助我?或者至少给我一些指示?

3 个答案:

答案 0 :(得分:2)

从我看到的查询中返回diagnosis_location字段不等于null的记录,因此您可以将其重写为 WHERE diagnosis_location IS NOT NULL

答案 1 :(得分:0)

你拥有它的方式很好。唯一的另一种方法是使用临时表。除非你的桌子很大,否则增加的复杂性是不值得的

编辑:我假设您有两列,Diagnosis_location和diagnosis_location。如果这不是真的而你刚刚写了一个错字,那么这个答案是错误的。

答案 2 :(得分:0)

如果您希望在没有子查询的情况下进行编写,请尝试使用连接语句:

SELECT firstname, lastname, date_of_birth          
FROM `data` A          
JOIN `data` B
ON A.diagnosis_location = B.Diagnosis_location 
GROUP BY firstname, lastname, date_of_birth 
HAVING COUNT(DISTINCT diagnosis_location) >= 2

出于好奇,如果你想要提高性能并且连接不能正常工作,你应该能够尝试EXISTS语句而不是IN语句:

SELECT firstname, lastname, date_of_birth 
FROM `data` A
WHERE EXISTS  
(SELECT 1 
FROM `data` B 
where B.Diagnosis_location = A.diagnosis_location) 
GROUP BY firstname, lastname, date_of_birth 
HAVING COUNT(DISTINCT diagnosis_location) >= 2