嵌套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:)