Sql 从两个表中获取第一条记录

Sql 从两个表中获取第一条记录,sql,Sql,我希望从下面的示例表中获得客户的第一个日期和项目描述 创建我的示例 CREATE TABLE cust ( CUSTNO int, ENAME varchar(50) ) CREATE TABLE orders ( CUSTNO int, Description varchar(50), ORDERDATE date ) INSERT INTO cust VALUES (7369, 'SMITH'); INSERT INTO cust VALUES (7499, 'ALLEN'); INSE

我希望从下面的示例表中获得客户的第一个日期和项目描述

创建我的示例

CREATE TABLE cust
(
CUSTNO int,
ENAME varchar(50)
)

CREATE TABLE orders
(
CUSTNO int,
Description varchar(50),
ORDERDATE date
)

INSERT INTO cust VALUES (7369, 'SMITH');
INSERT INTO cust VALUES (7499, 'ALLEN');
INSERT INTO cust VALUES (7521, 'WARD');
INSERT INTO cust VALUES (7566, 'JONES');
INSERT INTO cust VALUES (7654, 'MARTIN');
INSERT INTO cust VALUES (7698, 'BLAKE');
INSERT INTO cust VALUES (7782, 'CLARK');
INSERT INTO cust VALUES (7788, 'SCOTT');
INSERT INTO cust VALUES (7839, 'KING');
INSERT INTO cust VALUES (7844, 'TURNER');
INSERT INTO cust VALUES (7876, 'ADAMS');
INSERT INTO cust VALUES (7900, 'JAMES');
INSERT INTO cust VALUES (7902, 'FORD');
INSERT INTO cust VALUES (7934, 'MILLER');

INSERT INTO orders VALUES (7782, 'Something','17-DEC-1980');
INSERT INTO orders VALUES (7782, 'Something else', '17-DEC-2000');
INSERT INTO orders VALUES (7900, 'Something', '17-DEC-1980');
INSERT INTO orders VALUES (7900, 'Something else','17-DEC-1990');
INSERT INTO orders VALUES (7934, 'Something','17-DEC-1980');
我在尝试这样的事情

  select [ENAME],[cust].[CUSTNO], MIN([ORDERDATE]),[Description]
  from [cust],[orders]
  where [cust].[CUSTNO]=[orders].[CUSTNO]
  group by [cust].[CUSTNO],[ENAME],[Description]
我的问题是返回的行太多。我只想看到每个客户,然后列出他们的第一个日期(如果没有订单,则为空或空)


有什么想法吗?

只需从
分组依据
子句中省略
[ENAME]
[Description]
只需从
分组依据
子句中省略
[ENAME]
[Description]

;with cteMinOrder as (
    select [CUSTNO], MIN([ORDERDATE]) as minDate
        from [orders]
        group by [CUSTNO]
)
select [ENAME],[cust].[CUSTNO], mo.minDate, [Description]
    from [cust]
        left join cteMinOrder mo
            on [cust].[CUSTNO]=mo.[CUSTNO]
        left join [orders]
            on [cust].[CUSTNO]=[orders].[CUSTNO]
                and mo.minDate = [orders].[ORDERDATE]
 with MinOrder as (
  select
  custno, min(orderdate) orderdate
  from [orders]
  GROUP BY custno)

  select [ENAME],[cust].[CUSTNO], o.[orderdate], [Description]
   from 
  cust 
  LEFT JOIN orders o
  ON cust.custNo = o.custno
  LEFT JOiN MinOrder mo
  ON mo.orderdate = o.orderdate
    and mo.custno = o.custno
如果不能使用CTE,则可以使用内联视图

 select [ENAME],[cust].[CUSTNO], o.[orderdate], [Description]
   from 
  cust 
  LEFT JOIN orders o
  ON cust.custNo = o.custno
  LEFT JOiN (  select
     custno, min(orderdate) orderdate
  from [orders]
  GROUP BY custno)  mo
  ON mo.orderdate = o.orderdate
    and mo.custno = o.custno
如果不能使用CTE,则可以使用内联视图

 select [ENAME],[cust].[CUSTNO], o.[orderdate], [Description]
   from 
  cust 
  LEFT JOIN orders o
  ON cust.custNo = o.custno
  LEFT JOiN (  select
     custno, min(orderdate) orderdate
  from [orders]
  GROUP BY custno)  mo
  ON mo.orderdate = o.orderdate
    and mo.custno = o.custno
语法可能需要根据您使用的实际方言进行调整,但这种关系应该满足您的需要

  SELECT c.[ENAME],c.[CUSTNO], o.[orderdate], o.[Description] 
   FROM  cust  c
  LEFT JOIN orders o 
    ON c.custNo = o.custno 
  LEFT JOIN 
        ( SELECT   custno, min(orderdate) orderdate 
            FROM [orders] 
            GROUP BY custno)  mo 
    ON mo.orderdate = o.orderdate 
        AND mo.custno = o.custno 
语法可能需要根据您使用的实际方言进行调整,但这种关系应该满足您的需要

  SELECT c.[ENAME],c.[CUSTNO], o.[orderdate], o.[Description] 
   FROM  cust  c
  LEFT JOIN orders o 
    ON c.custNo = o.custno 
  LEFT JOIN 
        ( SELECT   custno, min(orderdate) orderdate 
            FROM [orders] 
            GROUP BY custno)  mo 
    ON mo.orderdate = o.orderdate 
        AND mo.custno = o.custno 
如果存在订单,则需要左连接来获取订单;如果不存在订单,则仍然需要左连接来获取客户@conrad Frix的解决方案也会起作用,但我在使用不接受with语句的数据库时考虑了这一点

将来,您应该停止编写隐式联接(使用逗号分隔表并将联接条件放入where子句)。它们是一种糟糕的编程技术,并导致您无法正确理解联接(或者您可能知道使用左联接)

如果存在订单,则需要左连接来获取订单;如果不存在订单,则仍然需要左连接来获取客户@conrad Frix的解决方案也会起作用,但我在使用不接受with语句的数据库时考虑了这一点


将来,您应该停止编写隐式联接(使用逗号分隔表并将联接条件放入where子句)。它们是一种糟糕的编程技术,并导致您无法正确理解联接(或者您可能知道使用左联接)

@HGLEM我想你是对的@HGLEM我想你是对的