Select 最长持续时间(数据类型字段)和客户端名称 SQL
Select longest duration time (data type field) and client name SQL
我有这些表:
CREATE TABLE Client
(
client_id NUMBER(10) NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
address VARCHAR(50) NOT NULL
);
CREATE TABLE Projects
(
project_id NUMBER(10) NOT NULL PRIMARY KEY,
project_name VARCHAR(200) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
client_id NUMBER(10) NOT NULL,
CONSTRAINT client_fk
FOREIGN KEY (client_id) REFERENCES Client(client_id)
);
INSERT INTO Client (client_id, name, address)
VALUES (1, 'Joe Doe', '11 Henry Smith St.Chelsea, MA 02150');
INSERT INTO Client (client_id, name, address)
VALUES (2, 'James Doe', '74 East Sierra Ave. Batavia, OH 45103');
INSERT INTO Projects (project_id, project_name, start_date, end_date, client_id)
VALUES (1, 'YYY', TO_DATE('2020/12/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),
TO_DATE('2020/12/30 21:02:44', 'yyyy/mm/dd hh24:mi:ss'), 1);
INSERT INTO Projects (project_id, project_name, start_date, end_date, client_id)
VALUES (2, 'XXX', TO_DATE('2020/11/01 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),
TO_DATE('2020/12/30 21:02:44', 'yyyy/mm/dd hh24:mi:ss'), 2);
我想 select 项目的最大持续时间和员工姓名。
我写了这个SQL声明:
SELECT
p.project_name, c.name,
FROM
Projects p, Client c
WHERE
p.client_id = c.client_id
AND max_time = (SELECT MAX(p.end_date - p.start_date) FROM Projects p);
但是我得到一个错误
ORA-00936: missing expression
只使用 fetch first
怎么样?
SELECT p.project_name, c.name
FROM Projects p JOIN
Client c
ON p.client_id = c.client_id
ORDER BY (p.estimated_end_date - p.project_start_date)
FETCH FIRST 1 ROW ONLY;
Here 是一个 db<>fiddle。 SQLFiddle 上的 Oracle 版本已经过时,不支持 FETCH FIRST
.
fiddle 中的列名有问题,c.name
后有不需要的尾随逗号。
考虑:
SELECT p.project_name, c.name
FROM Projects p
INNER JOIN Client c ON p.client_id = c.client_id
WHERE (p.end_date - p.start_date) = (
SELECT MAX(end_date - start_date) FROM Projects
);
在 Oracle 12 或更高版本中,您还可以使用 FETCH
子句,正如 Gordon Linoff 所建议的那样。我建议 WITH TIES
使查询等同于您的原始代码:
SELECT p.project_name, c.name
FROM Projects p
INNER JOIN Client c ON p.client_id = c.client_id
ORDER BY p.end_date - p.start_date DESC
FETCH FIRST ROW WITH TIES
在旧版本中,您可以使用 RANK()
代替:
SELECT *
FROM (
SELECT p.project_name, c.name,
RANK() OVER(ORDER BY p.end_date - p.start_date DESC) as rn
FROM Projects p
INNER JOIN Client c ON p.client_id = c.client_id
) t
WHERE rn = 1
我有这些表:
CREATE TABLE Client
(
client_id NUMBER(10) NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
address VARCHAR(50) NOT NULL
);
CREATE TABLE Projects
(
project_id NUMBER(10) NOT NULL PRIMARY KEY,
project_name VARCHAR(200) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
client_id NUMBER(10) NOT NULL,
CONSTRAINT client_fk
FOREIGN KEY (client_id) REFERENCES Client(client_id)
);
INSERT INTO Client (client_id, name, address)
VALUES (1, 'Joe Doe', '11 Henry Smith St.Chelsea, MA 02150');
INSERT INTO Client (client_id, name, address)
VALUES (2, 'James Doe', '74 East Sierra Ave. Batavia, OH 45103');
INSERT INTO Projects (project_id, project_name, start_date, end_date, client_id)
VALUES (1, 'YYY', TO_DATE('2020/12/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),
TO_DATE('2020/12/30 21:02:44', 'yyyy/mm/dd hh24:mi:ss'), 1);
INSERT INTO Projects (project_id, project_name, start_date, end_date, client_id)
VALUES (2, 'XXX', TO_DATE('2020/11/01 21:02:44', 'yyyy/mm/dd hh24:mi:ss'),
TO_DATE('2020/12/30 21:02:44', 'yyyy/mm/dd hh24:mi:ss'), 2);
我想 select 项目的最大持续时间和员工姓名。
我写了这个SQL声明:
SELECT
p.project_name, c.name,
FROM
Projects p, Client c
WHERE
p.client_id = c.client_id
AND max_time = (SELECT MAX(p.end_date - p.start_date) FROM Projects p);
但是我得到一个错误
ORA-00936: missing expression
只使用 fetch first
怎么样?
SELECT p.project_name, c.name
FROM Projects p JOIN
Client c
ON p.client_id = c.client_id
ORDER BY (p.estimated_end_date - p.project_start_date)
FETCH FIRST 1 ROW ONLY;
Here 是一个 db<>fiddle。 SQLFiddle 上的 Oracle 版本已经过时,不支持 FETCH FIRST
.
fiddle 中的列名有问题,c.name
后有不需要的尾随逗号。
考虑:
SELECT p.project_name, c.name
FROM Projects p
INNER JOIN Client c ON p.client_id = c.client_id
WHERE (p.end_date - p.start_date) = (
SELECT MAX(end_date - start_date) FROM Projects
);
在 Oracle 12 或更高版本中,您还可以使用 FETCH
子句,正如 Gordon Linoff 所建议的那样。我建议 WITH TIES
使查询等同于您的原始代码:
SELECT p.project_name, c.name
FROM Projects p
INNER JOIN Client c ON p.client_id = c.client_id
ORDER BY p.end_date - p.start_date DESC
FETCH FIRST ROW WITH TIES
在旧版本中,您可以使用 RANK()
代替:
SELECT *
FROM (
SELECT p.project_name, c.name,
RANK() OVER(ORDER BY p.end_date - p.start_date DESC) as rn
FROM Projects p
INNER JOIN Client c ON p.client_id = c.client_id
) t
WHERE rn = 1