0

我想查询如果同一用户在数据库中只有 1 个条目。

我有两个不同的表sr. sName, Gender, IDrCode, rID, Numb

用户可以拥有一个Numb具有两个不同值20和属性的条目21。我只在用户r.Numb = 21没有20在一起的情况下尝试检索。另外,我使用了这个查询,但没有成功。怎么解决?

SELECT s.Name, s.Gender
FROM s, r
WHERE s.ID = r.rID
    AND r.Code = '21'
    AND NOT r.Numb = '20'
GROUP BY s.Name, s.Gender
HAVING COUNT(s.Name) = 1

我在 StackOverflow 上进行了搜索,但无法得到正确的结果。

4

2 回答 2

0

在现有的聚合查询的基础上,您可以在HAVING子句中对具有r.Numb = 21和不具有的用户进行条件求和r.Numb = 20

SELECT s.Name, s.Gender
FROM s
INNER JOIN r ON s.ID = r.rID
GROUP BY s.Name, s.Gender
HAVING 
    SUM(CASE WHEN r.Numb = 21 THEN 1 ELSE 0 END) = 1
    AND SUM(CASE WHEN r.Numb = 2O THEN 1 ELSE 0 END) = 0

或者您可以使用EXISTSand NOT EXITS

SELECT s.*
FROM s
WHERE
    EXISTS (SELECT 1 FROM r WHERE r.rID = s.ID AND r.Numb = 21)
    AND NOT EXISTS (SELECT 1 FROM r WHERE r.rID = s.ID AND r.Numb = 20)

重要提示:始终使用显式标准连接。20 多年来,不鼓励使用隐式连接(在 where 子句中使用逗号)。

于 2019-12-15T18:37:12.200 回答
0

您可以稍微更改您的查询以获得所需的输出(除了EXISTS解决方案)

SELECT s.Name, 
       s.Gender 
  FROM s join r 
    ON s.ID = r.rID
 WHERE r.Numb in ('20','21')
GROUP BY s.Name, s.Gender 
HAVING SUM(case when r.numb = '20' then 1 end) = 0

注意:使用标准 ANSI 连接。

干杯!!

于 2019-12-16T02:53:04.843 回答