Mysql 不使用子查询的SQL查询

Mysql 不使用子查询的SQL查询,mysql,sql,subquery,Mysql,Sql,Subquery,不久前,我来到这个网站,试图找到一个查询,结果如下。它所做的,以及我需要它做的,是查看表“数据”,并返回在两个不同的diagnosis\u地点接受治疗的任何客户的名字、姓氏和出生日期。它起作用了 SELECT firstname, lastname, date_of_birth FROM `data` WHERE diagnosis_location IN (SELECT DISTINCT Diagnosis_location

不久前,我来到这个网站,试图找到一个查询,结果如下。它所做的,以及我需要它做的,是查看表“数据”,并返回在两个不同的
diagnosis\u地点接受治疗的任何客户的名字、姓氏和出生日期。它起作用了

  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

但是,现在我需要接受相同的查询,并在不使用任何子查询的情况下获得相同的结果。有人能帮我吗?或者至少给我一些指针?

从我看到的情况来看,您的查询返回的记录中,
diagnosis\u location
字段不等于null,因此您可以将其重写为
诊断位置不为空时

您的诊断方式很好。唯一的其他方法是使用临时表。除非你的桌子很大,否则增加的复杂性是不值得的


编辑:我假设你有两列,诊断位置和诊断位置。如果这不是真的,您只是输入了一个错误,那么这个答案是错误的。

如果您希望在没有子查询的情况下编写,请尝试join语句:

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
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 
出于好奇,如果您正在寻找性能提升,而联接工作不正常,则应该能够尝试EXISTS语句而不是IN语句:

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
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 

为什么需要在没有子查询的情况下执行此操作?如果这样做有效,那么为什么需要在没有子查询的情况下执行此操作?您使用的是哪台sql server?+1-看起来原始查询编写得很糟糕(为什么要在
子类中的
上使用
DISTINCT
),而且非常模糊,谢谢。这个答案正是我想要的。@JNK:对我来说,它看起来更像一个谜题,而不是一个写得很糟糕的查询。@a1ex07-不必要地使用
DISTINCT
是一个性能杀手,答案不正确。如果一行的诊断位置存在于诊断位置中,但不等于其诊断位置,则不会返回该行。这将是在第一次one@sll-SELECT 1是使用EXISTS语句时可以使用的一个小技巧。基本上说是“找到时返回true”。@Tom Squires-基于原始查询,并假设原始查询工作正常,IN(语句)似乎是一个有效的位置查询。基于这一假设,EXISTS语句的运行速度应该比IN语句快得多。