Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:属性同时匹配两个不同的条件_Sql_Oracle - Fatal编程技术网

SQL:属性同时匹配两个不同的条件

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

我想做一个查询,其中一个属性(相同的属性)同时匹配两个不同的条件。我必须检查两个城市是否都有司机

我试图使用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 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),那么将来共享会话链接作为提供可复制示例的一部分将非常有帮助(或者可以随意复制并粘贴示例)。人们可以猜测您的表和数据是什么样子,并为简单的事情编写脚本,但如果我们在回答之前看到您看到的内容,您将得到更多帮助。