我创建了以下表格:
create table people
(
ID varchar(10),
name varchar(35),
CONSTRAINT pk_ID PRIMARY KEY (ID)
);
create table numbers
(
code varchar(10),
ID varchar(10),
number numeric,
CONSTRAINT pk_code PRIMARY KEY (code)
);
我插入了以下数据:
insert into people(ID, name)
values('fdx1','Peter');
insert into people(ID, name)
values('fdx2','Alice');
insert into people(ID, name)
values('fdx3','Louis');
insert into numbers(code, ID, number)
values('001','fdx1',1);
insert into numbers(code, ID, number)
values('002','fdx1',1);
insert into numbers(code, ID, number)
values('003','fdx2',2);
insert into numbers(code, ID, number)
values('004','fdx2',3);
insert into numbers(code, ID, number)
values('005','fdx3',4);
insert into numbers(code, ID, number)
values('006','fdx3',4);
我的问题是:如何选择号码相同的人。例如“彼得”和“路易斯”。
答案 0 :(得分:1)
“相同的数字”表示此人numbers
中只有一个数字。您可以使用group by
和having
:
select n.id
from numbers n
group by n.id
having min(number) = max(number);
注意:这不会考虑NULL
。如果其中一个值为NULL
,则您的问题未指定要执行的操作。
答案 1 :(得分:1)
如果我理解正确,您希望从具有相同数字两次的数字中的每个用户中看出2行?如果是这样你就可以做到。
SELECT p.ID, p.name, p.number, COUNT(DISTINCT n.id) as num
FROM people as p
INNER JOIN numbers as n on n.ID = p.ID
GROUP BY p.ID, n.number
HAVING num > 1
将返回一个人员列表,如何多次使用相同的数字
如果这不是您正在寻找的其他东西,您可以做的是:
要返回特定号码的人员列表,您可以执行以下操作
SELECT p.ID, p.name
FROM people as p
INNER JOIN numbers as n on n.ID = p.ID
WHERE n.number = [[X]]
您可以将[[X]]替换为例如1然后,这将返回在这种情况下链接到数字1的人员列表彼得
如果您想要所有人及其相关号码的列表,您可以这样做:
SELECT p.ID, p.name, n.number
FROM people as p
INNER JOIN numbers as n on n.ID = p.ID
ORDER BY n.number
这将返回用户ID,名称及其相关联的号码。
答案 2 :(得分:1)
您可以使用此查询:
select p.name, n.number, count(*) repeats
from people p
inner join numbers n on n.ID = p.ID
group by p.id, n.number
having count(*) > 1
列出了重复号码的人员姓名。该数字包含在输出中,以及它出现的次数。
输出:
| name | number | repeats |
|-------|--------|---------|
| Peter | 1 | 2 |
| Louis | 4 | 2 |