我有这三个表:
create table albums(sernum number primary key,
Albname varchar2(30) not null,
Artist varchar2(20) not null,
Pdate number(4),
Recompany varchar2(10),
Media char(2) not null);
create table tracks(sernum number not null,
song varchar2(50) not null,
primary key(sernum, song),
foreign key(sernum) references albums(sernum));
create table performers(sernum number not null,
Artist varchar2(30) not null,
Instrument varchar2(50) not null,
primary key(sernum, Artist, Instrument),
foreign key (sernum) references albums(sernum));
我想在sql oracle中执行两个查询:
这是我的尝试:
select distinct(a.Artist) from albums a where a.Artist like (select p.Artist, distinct(p.Instrument) from performers p) group by a.Artist, p.Instrument;
select a.Albname from albums a, inner join tracks t on where a.sernum in(select max(t.sernum) group by t.sernum);
答案 0 :(得分:3)
查询1 - 获取已播放所有乐器的艺术家:
SELECT
p.Artist
FROM
(
SELECT Artist, count(distinct Instrument) as InstrumentCount
FROM performers
GROUP BY artist
) p
JOIN
(
SELECT COUNT(DISTINCT Instrument) as InstrumentCount
FROM performers
) i
ON p.InstrumentCount = i.InstrumentCount
解释:第一个子查询获取每位艺术家演奏的乐器数量。第二个子查询获得了独特乐器的数量。根据这个乐器数量,两者结合在一起,只给那些乐器数量达到最大值的艺术家。
-
查询2 - 获取包含最多歌曲数量的相册:
WITH
AlbumTrackCount
(
SELECT
sernum,
COUNT(1) as TrackCount
FROM tracks
GROUP BY sernum
)
SELECT
a.Albname
FROM albums a
JOIN AlbumTrackCount atc
ON a.sernum = atc.sernum
AND atc.TrackCount =
(
SELECT MAX(TrackCount)
FROM AlbumTrackCount
)
解释:WITH up top建立了一个我们将重用的子查询;它让我们获得每张专辑中的曲目数。在下面,我们使用此专辑曲目计数加入专辑,并添加一个过滤器,只有那些曲目数等于任何专辑的最大曲目数的专辑。请注意,这与顶级查询不同,后者只获得了所有乐器;在这里,重要的是首先计算每张专辑中的曲目,然后获得这些曲目的最大值。
答案 1 :(得分:1)
以下是您的查询的一些问题:
SELECT DISTINCT (a.artist)
FROM albums a
WHERE a.artist LIKE (SELECT p.artist,
distinct(p.Instrument)
from performers p)
group by a.Artist, p.Instrument;
LIKE
表示您将使用通配符。与where
子句中的子查询进行比较时,通常使用in
作为运算符。DISTINCT
不是函数。它始终适用于SELECT
语句中的所有列。DISTINCT
和GROUP BY
用于非常相似的目的。你很少在同一个声明中使用它们。where
子句中的查询)。SELECT a.albname
FROM albums a,
inner join tracks t
on
where a.sernum in(select max(t.sernum) group by t.sernum);
inner join
连接两个表。逗号表示pre-SQL:1999语法,而INNER JOIN
是SQL:1999。虽然从技术上讲,您可以在单个FROM
子句中使用它们,但不能在一对表之间使用它们。此外,你不应该同时使用两者。 Sticj to SQL:1999。ON
子句为空。你应该在这里加入你的两张桌子。如果你真的想要没有连接条件,可以将连接更改为CROSS JOIN
(重新迭代:你几乎肯定不会想要这个)。SELECT
语句没有FROM
子句。这是不允许的。