2010-12-07 5 views
1
에서 첫 번째 레코드를 얻기

내 예를 들어이두 테이블

같은

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] 

내 문제는 너무 많은 행을 반환합니다. 나는 각 고객을보고 처음 데이트를 나열하고 싶다. (주문이 없다면 공란이거나 null이다.)

아이디어가 있으십니까? 당신이 CTE를 사용할 수없는 경우 당신은 인라인 뷰를 사용할 수 있습니다

답변

2
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 절을 조인 조건으로 지정). 그것들은 나쁜 프로그래밍 테크닉이며 왜 조인을 올바르게 이해하지 못했는지 (또는 왼쪽 조인을 사용했음을 알았을 것입니다)에 기여합니다.

+0

@HGLEM http://programmers.stackexchange.com/questions/610/what-syntax-element-do-you-love-most-in-a-programming-language-you-use를 작성하는 것이 맞을 것 같습니다. -frequently/792 # 792 –

2
;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] 
-1

그냥 대신

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 
+0

오류가 발생합니다. – bobs

3
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 

1
select [ENAME],[cust].[CUSTNO],[minorderdate],[Description] 
from 
    [cust] 
left join 
    select [CUSTNO],MIN([ORDERDATE]) AS minorderdate 
    from [orders] 
    group by [CUSTNO] as t 
on [cust].[CUSTNO] = [t].[CUSTNO]; 

구문 수있는 GROUP BY 절에서 [ENAME][Description]을 생략 당신이 사용하고있는 실제 방언에 따라 조정할 필요가 있지만 그 관계는 당신이하는 일을해야합니다. 개미.