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

代码如下:http://sqlfiddle.com/#!4/00720/1

只使用 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