0

我有一个问题,我必须在表中找到唯一的元组,而在另一个表中从未见过它们。然后我必须计算这些元组并显示出现超过 10 次的元组。也就是说,有些工作不需要工作人员,我要找到从未需要工作人员并且已经运行超过10次的工作。

create table JobStaff (
    Job         integer references Job(id),
    staff       integer references Staff(id),
    role        integer references JobRole(id),
    primary key (job,staff,role)
);

create table Job (
    id          integer, 
    branch      integer not null references Branches(id),
    term        integer not null references Terms(id),
    primary key (id)
);

基本上我的代码存在于:

CREATE OR REPLACE VIEW example AS
SELECT * FROM Job
WHERE id NOT IN (SELECT DISTINCT jobid FROM JobStaff);

create or replace view exampleTwo as
select branch, count(*) as ct from example group by 1;

create or replace view sixThree as
select branch, ct from exampleTwo where ct > 30;

这似乎返回两个额外的行,然后是预期的结果。我问了我的讲师,他说这是因为我计算了有时

编辑:这意味着,对于所有可用的工作条款,没有分配给它的工作人员

EDIT2:预期输出和我得到的:

我得到了什么:

 branch  | cou
---------+-----
    7973 |  34
    7978 |  31
    8386 |  33
    8387 |  32
    8446 |  32
    8447 |  32
    8448 |  31
   61397 |  31
   62438 |  32
   63689 |  31

预期的:

 branch  | cou
---------+-----
    7973 |  34
    8387 |  32
    8446 |  32
    8447 |  32
    8448 |  31
   61397 |  31
   62438 |  32
   63689 |  31
4

1 回答 1

2

您必须了解 SQL 的工作方式是在您设计查询之前必须知道您想要什么。

在您的问题中,您写道您正在寻找jobs不在其中的内容,jobstuff但现在我们在这里有了答案,很明显您正在寻找branches不在的内容jobstuff。我给你的建议是:在尝试实现它之前,花点时间(用你的语言,或者用英语,但不要用 SQL)准确地说出你想要的东西。当您更有经验时,这并不总是必要的,但对于初学者来说,这是学习 SQL 的最佳方式。

解决方案:

这里的事情是您不需要视图来级联查询,您只需从inner queries. count也可以通过having子句根据计算值(如 )过滤元素。

count(DISTINCT ...)导致重复条目只计算一次,因此如果一个作业在一个术语中出现两次,它现在只计算一次。

下面的查询选择所有branches曾经得到 a 的内容jobstaff,然后查找jobs不在此列表中的内容。

据我了解您的问题,这应该可以帮助您:

SELECT branch, count(DISTINCT term_id) as cou
FROM jobs j
WHERE j.branch NOT IN (SELECT branch FROM job WHERE job.id IN (select jobid FROM jobstaff))
GROUP BY branch
HAVING count(DISTINCT term_id) > 10
于 2012-04-19T12:39:54.837 回答