在SQL中不使用唯一构造重写

时间:2012-03-05 19:46:45

标签: sql unique construct

使用模式成员(memb_no,name,age),book(isbn,title,authors,publisher)和借用(memb_no,isbn,date),我有以下查询。唯一的问题是我不应该使用独特的结构。如何在不使用唯一构造的情况下重新编写它?

Select T.course_id 
From course as T 
Where unique (select R.course_id 
       From section as R 
       Where T.course_id = R.course_id and R.year = 2009);

5 个答案:

答案 0 :(得分:3)

您已经获得了其他有效答案,但我的首选表格是:

Select T.course_id 
From course as T 
Where (Select Count(*)
       From section as R 
       Where T.course_id = R.course_id and R.year = 2009) = 1;

答案 1 :(得分:1)

只需将您的unique查询重写为要加入course的子查询:

select t.course_id
from course as t
join(
    select course_id
    from section
    where year=2009
    group by course_id
    having count(1)=1
)r
on (t.course_id=r.course_id);

答案 2 :(得分:1)

脱离我的头顶:

Select T.course_id 
From course as T 
Where exists(select R.course_id 
       From section as R 
       Where T.course_id = R.course_id and R.year = 2009
       group by course_id having count(*)=1);

答案 3 :(得分:0)

如果子查询为空,则UNIQUE构造返回 true 。因此,此查询的正确等效项是(请注意<=):

Select T.course_id 
From course as T 
Where 1 <= (Select Count(*)
   From section as R 
   Where T.course_id = R.course_id and R.year = 2009);

P.S。这是数据库系统概念教科书中的一个例子(第六版)。 p中给出了示例。 94和我提到的等效语句在p中给出。 95。

答案 4 :(得分:0)

书本示例有误。

请参阅:https://www.db-book.com/db6/errata-dir/errata-part1.pdf(第11号)

唯一查询的收集解决方法:

SELECT T.course_id
FROM course as T
WHERE (
    SELECT count(R.course_id)
    FROM section as R
    WHERE T.course_id = R.course_id AND R.year = 2019
) <= 1;