嵌套Oracle SQL-多个值

嵌套Oracle SQL-多个值,sql,oracle,select,nested,Sql,Oracle,Select,Nested,我的表格结构如下: Table = contact Name Emailaddress ID Bill bill@abc.com 1 James james@abc.com 2 Gill gill@abc.com 3 Table = contactrole ContactID Role 1 11 1 12 1 13 2 11 2 12 3

我的表格结构如下:

Table = contact

Name    Emailaddress    ID
Bill    bill@abc.com    1
James   james@abc.com   2
Gill    gill@abc.com    3

Table = contactrole

ContactID   Role
1           11
1           12
1           13
2           11
2           12
3           12
我想从第一个表中选择姓名和电子邮件地址,在该表中,此人的角色是12,而不是11或13。在这个例子中,它应该只返回Gill

我相信我需要一个嵌套的SELECT,但在这样做时有困难。我做了下面的操作,但显然它不起作用,并且返回了所有内容

SELECT c.Name, c.Emailaddress FROM contact c
WHERE (SELECT count(*) FROM contactrole cr
       c.ID = cr.ContactID
       AND cr.Role NOT IN (11, 13)
       AND cr.Role IN (12)) > 0

您可以组合使用
存在
不存在

SELECT *
FROM contact c
WHERE
    EXISTS(SELECT 1 FROM contactrole cr WHERE cr.ContactID = c.ID AND cr.Role = 12)
    AND NOT EXISTS(SELECT 1 FROM contactrole cr WHERE cr.ContactID = c.ID AND cr.Role IN(11, 13))

另一个选项是使用
分组依据
拥有

SELECT c.*
FROM contact c
INNER JOIN contactrole cr
    ON cr.ContactID = c.ID
GROUP BY
    c.ID, c.Name, c.Emailaddress
HAVING 
    SUM(CASE WHEN cr.Role = 12 THEN 1 ELSE 0 END) > 0
    AND  SUM(CASE WHEN cr.Role IN(11, 13) THEN 1 ELSE 0 END) = 0

您可以组合使用
存在
不存在

SELECT *
FROM contact c
WHERE
    EXISTS(SELECT 1 FROM contactrole cr WHERE cr.ContactID = c.ID AND cr.Role = 12)
    AND NOT EXISTS(SELECT 1 FROM contactrole cr WHERE cr.ContactID = c.ID AND cr.Role IN(11, 13))

另一个选项是使用
分组依据
拥有

SELECT c.*
FROM contact c
INNER JOIN contactrole cr
    ON cr.ContactID = c.ID
GROUP BY
    c.ID, c.Name, c.Emailaddress
HAVING 
    SUM(CASE WHEN cr.Role = 12 THEN 1 ELSE 0 END) > 0
    AND  SUM(CASE WHEN cr.Role IN(11, 13) THEN 1 ELSE 0 END) = 0

Having
子句中使用条件聚合来筛选记录

试试这个

SELECT c.NAME, 
       c.emailaddress 
FROM   contact c 
WHERE  id IN (SELECT contactid 
              FROM   contactrole 
              GROUP  BY contactid 
              HAVING Count(CASE WHEN role = 12 THEN 1 END) > 1 
                     AND Count(CASE WHEN role in (11,13) THEN 1 END) = 0)
如果您在
角色中只有
11,12,13
,则使用可以使用此

SELECT c.NAME, 
       c.emailaddress 
FROM   contact c 
WHERE  id IN (SELECT contactid 
              FROM   contactrole 
              GROUP  BY contactid 
HAVING Count(CASE WHEN role = 12 THEN 1 END) = count(*)

Having
子句中使用条件聚合来筛选记录

试试这个

SELECT c.NAME, 
       c.emailaddress 
FROM   contact c 
WHERE  id IN (SELECT contactid 
              FROM   contactrole 
              GROUP  BY contactid 
              HAVING Count(CASE WHEN role = 12 THEN 1 END) > 1 
                     AND Count(CASE WHEN role in (11,13) THEN 1 END) = 0)
如果您在
角色中只有
11,12,13
,则使用可以使用此

SELECT c.NAME, 
       c.emailaddress 
FROM   contact c 
WHERE  id IN (SELECT contactid 
              FROM   contactrole 
              GROUP  BY contactid 
HAVING Count(CASE WHEN role = 12 THEN 1 END) = count(*)

可以使用联接来执行此操作:

SELECT c.*
  FROM CONTACT c
  INNER JOIN CONTACTROLE cr12
    ON cr12.CONTACTID = c.ID AND
       cr12.ROLE = 12
  LEFT OUTER JOIN CONTACTROLE cr11
    ON cr11.CONTACTID = c.ID AND
       cr11.ROLE = 11
  LEFT OUTER JOIN CONTRACTROLE cr13
    ON cr13.CONTACTID = c.ID AND
       cr13.ROLE = 13
  WHERE cr11.ROLE IS NULL AND
        cr13.ROLE IS NULL
内部连接联系人角色cr12
要求给定联系人ID存在角色12;
左侧外部连接联系人Role cr11
左侧外部连接合同Role cr13
检查给定联系人ID是否存在角色11和13;WHERE子句验证角色11或13都不存在


祝您好运。

您可以使用连接:

SELECT c.*
  FROM CONTACT c
  INNER JOIN CONTACTROLE cr12
    ON cr12.CONTACTID = c.ID AND
       cr12.ROLE = 12
  LEFT OUTER JOIN CONTACTROLE cr11
    ON cr11.CONTACTID = c.ID AND
       cr11.ROLE = 11
  LEFT OUTER JOIN CONTRACTROLE cr13
    ON cr13.CONTACTID = c.ID AND
       cr13.ROLE = 13
  WHERE cr11.ROLE IS NULL AND
        cr13.ROLE IS NULL
内部连接联系人角色cr12
要求给定联系人ID存在角色12;
左侧外部连接联系人Role cr11
左侧外部连接合同Role cr13
检查给定联系人ID是否存在角色11和13;WHERE子句验证角色11或13都不存在


祝你好运。

太好了!干杯@Prdp:)太好了!干杯@Prdp:)