SQL:属性同时匹配两个不同的条件
我想做一个查询,其中一个属性(相同的属性)同时匹配两个不同的条件。我必须检查两个城市是否都有司机 我试图使用intersect,但没有找到任何匹配项。但在我的表中,有一个驱动程序符合这个条件SQL:属性同时匹配两个不同的条件,sql,oracle,Sql,Oracle,我想做一个查询,其中一个属性(相同的属性)同时匹配两个不同的条件。我必须检查两个城市是否都有司机 我试图使用intersect,但没有找到任何匹配项。但在我的表中,有一个驱动程序符合这个条件 SELECT s.NumeSofer FROM Soferi s INNER JOIN contraventii c ON s.idSofer=c.idSofer INNER JOIN localitati l ON c.idLocContr=l.idLoc WHER
SELECT s.NumeSofer
FROM Soferi s
INNER JOIN contraventii c ON s.idSofer=c.idSofer
INNER JOIN localitati l ON c.idLocContr=l.idLoc
WHERE l.DenLoc IN ('Iasi', 'Rosiori') AND l.Jud IN ('IS', 'NT');
INTERSECT
SELECT s.NumeSofer
FROM Soferi s
INNER JOIN contraventii c ON s.idSofer=c.idSofer
INNER JOIN localitati l ON c.idLocContr=l.idLoc
WHERE l.DenLoc='Rosiori' AND l.Jud='NT';
改为按分组。使用
case
表达式进行条件聚合:
SELECT s.NumeSofer, count(distinct l.DenLoc) as totcount,
count(case when l.DenLoc='Rosiori' then 1 end) as Rosioricount,
count(case when l.DenLoc='Iasi' then 1 end) as Iasicount
FROM Soferi s
INNER JOIN contraventii c ON s.idSofer=c.idSofer
INNER JOIN localitati l ON c.idLocContr=l.idLoc
WHERE (l.DenLoc='Rosiori' AND l.Jud='NT')
OR (l.DenLoc='Iasi' AND l.Jud='IS')
GROUP BY s.NumeSofer
ORDER BY totcount desc
有totcount=2的行吗
要仅获取具有两个DenLoc的驱动程序,请添加一个具有子句的:
SELECT s.NumeSofer, count(distinct l.DenLoc) as totcount,
count(case when l.DenLoc='Rosiori' then 1 end) as Rosioricount,
count(case when l.DenLoc='Iasi' then 1 end) as Iasicount
FROM Soferi s
INNER JOIN contraventii c ON s.idSofer=c.idSofer
INNER JOIN localitati l ON c.idLocContr=l.idLoc
WHERE (l.DenLoc='Rosiori' AND l.Jud='NT')
OR (l.DenLoc='Iasi' AND l.Jud='IS')
GROUP BY s.NumeSofer
HAVING count(distinct l.DenLoc) > 1
您可以使用聚合和HAVING
子句,如:
SELECT s.NumeSofer
FROM Soferi s
INNER JOIN contraventii c ON s.idSofer=c.idSofer
INNER JOIN localitati l
ON c.idLocContr = l.idLoc
AND (l.DenLoc, l.Jud) IN ( ('Iasi', 'IS'), ('Rosiori', 'NT') )
GROUP BY s.NumeSofer
HAVING
MAX(CASE WHEN l.DenLoc = 'Iasi' AND l.Jud = 'IS' THEN 1 END) = 1
AND MAX(CASE WHEN l.DenLoc = 'Rosiori' AND l.Jud = 'NT' THEN 1 END) = 1
这将为您带来所有NumeSofer
,其中至少有一条记录存在于localitati
中的DenLoc='Iasi'和Jud='IS'
,并且至少有一条记录存在于DenLoc='Rosiori'和Jud='NT'
注意:
运算符中的可以与元组值一起使用;这减少了查询的长度,同时避免使用或
,这通常不利于总体性能。谢谢您的回答。通过您提供的解决方案,我得到了所有驱动程序的结果名称,即使它们仅在“Iasi”或“Rosiori”中出现。但我只需要得到在这两个问题上都有问题的司机的名字。这就是问题2,有问题!您使用的是哪种数据库管理系统?我正在为Oracle进行培训。但是我使用的是Oracle Live SQL如果您使用的是Live SQL(或SQL fiddle),那么将来共享会话链接作为提供可复制示例的一部分将非常有帮助(或者可以随意复制并粘贴示例)。人们可以猜测您的表和数据是什么样子,并为简单的事情编写脚本,但如果我们在回答之前看到您看到的内容,您将得到更多帮助。