【发布时间】:2012-01-09 04:45:26
【问题描述】:
我无法针对问题提出查询。我有三张桌子
CREATE TABLE institute (
iid INT PRIMARY KEY,
sign VARCHAR(127) UNIQUE,
city VARCHAR(127) NOT NULL,
area INT CHECK (area>0));
CREATE TABLE desease (
did INT PRIMARY KEY,
name VARCHAR(127) UNIQUE,
level INT CHECK (level>0));
CREATE TABLE studies (
did INT,
iid INT,
FOREIGN KEY (did) REFERENCES desease (did),
FOREIGN KEY (iid) REFERENCES institute (iid),
PRIMARY KEY (iid,did));
我的问题是:里斯本数量最多的研究所的疾病名称是什么(里斯本从institute 请求city)。这是我想出的,但它没有给我正确的答案。
SELECT DISTINCT D.name, MAX(I.iid)
FROM desease D, studies S
JOIN institute I ON (S.iid = I.iid)
WHERE I.city = 'Lisboa' AND D.did = S.did
GROUP BY D.nome
HAVING COUNT(I.iid) = MAX(I.city)
举个例子:想象一下 5 个机构 al,city = 'Lisbon' 和 iid A,B,C,D,E (仅出于演示目的,我知道类型是 INT); 5种疾病名称分别为Z,X,N,V,M。
现在假设疾病 Z、X 和 M 由机构 A、B、C 研究(以任何顺序),疾病 N 由 D(1 个机构)研究,疾病 V 由 E 研究(只有一个) .所以任何里斯本研究所研究的疾病的最大数量是 3(A、B 和 C 都研究 3 种疾病)所以表格看起来像这样
Z - 3
X - 3
M - 3
编辑:我设法找到了一种方法。这是我提出的查询
SELECT DISTINCT D.name, COUNT(*) AS C
FROM desease D, studies E, institute I
WHERE I.iid = E.iid AND D.did = E.did AND I.city = "Lisboa"
GROUP BY D.name
HAVING C >= ALL (
SELECT COUNT(*)
FROM desease D, studies E, institute I
WHERE I.iid = E.iid AND D.did = E.did AND I.cidade = "Lisboa"
GROUP BY D.name
);
【问题讨论】:
-
天哪,你需要告诉我该怎么做
-
请重新表述您的问题。我不明白你到底需要什么。
-
一个研究所研究一种疾病。想象一下里斯本研究最多疾病的研究所。使 X 这个数量的疾病。我需要里斯本的 X 研究所正在研究的疾病的名称。所以我得到一张桌子 (D.name, X)
-
如果您包含示例数据和预期结果会有所帮助。