0

使用模式成员(memb_no,名称,年龄),书籍(isbn,标题,作者,出版商)和借用(memb_no,isbn,日期),我有以下查询。唯一的问题是我不应该使用独特的构造。如何在不使用独特构造的情况下重写它?

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);
4

5 回答 5

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;
于 2012-03-05T19:55:05.527 回答
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);
于 2012-03-05T19:50:09.133 回答
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);
于 2012-03-05T19:51:28.823 回答
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
  );

PS 这是教科书数据库系统概念(第 6 版)中的一个示例。示例在 p.1 中给出。94 和我提到的等效声明在第 94 页给出。95.

于 2018-10-13T22:17:23.983 回答
0

书中的例子有一个错误。

见:https ://www.db-book.com/db6/errata-dir/errata-part1.pdf (No.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;
于 2019-09-26T08:59:36.913 回答