2011-04-21 3 views
0

조인 유형을 사용하면 2010 년 11 월 1 일 이후에 작성된 고객 레코드의 이름, 성, 이름을 반환합니다. 고객이 주문한 경우에만 세 번째 열에 순서 번호를 포함하십시오 .이 SQL 쿼리가 맞습니까? LEFT OUTER JOIN을 사용 중입니다.

SELECT c.firstname, 
      c.lastname, 
      o.ordernumber 
    FROM Customers c 
LEFT JOIN Orders o ON c.customerid = o.customerid 
    WHERE o.orderdate > '2010-01-01' 
     AND o.ordernumber IS NOT NULL 
+3

2010 년 11 월 1 일은 위에 설명한대로 '2010-01-01'이 아닙니다. –

+0

@ 브라이언 : +1, 니스가 발견되었습니다. –

+0

당신은 '고객 기록은 2010 년 11 월 1 일 이후에 생성되었습니다.'라고 말했지만, 귀하의 질의에서 '주문. 주문 날짜'열을 확인하고 있습니다 (다른 날짜에도 Bryan이 깔끔하게 관찰 됨). 이 칼럼은 고객 기록 생성과 관련이 있습니까? 아니면 '고객 기록 생성'이 실제로 무엇을 의미합니까? –

답변

1

이것은 내부 결합과 같습니다. 예 :

SELECT c.firstname, 
c.lastname, 
o.ordernumber FROM Customers c 
Inner JOIN Orders o 
ON  c.customerid = o.customerid 
where o. orderdate > '01-01-2010' 

은 동일한 결과를 반환해야합니다. LEFT JOIN은 해당 ORDER 레코드가 있는지 여부에 관계없이 CUSTOMER을 반환하려는 경우에 사용됩니다. 그냥 사용자가 주문한 고객이 원한다면 INNER JOIN.

@Bryan이 지적했듯이 날짜를 형식에 맞게 변환하는 것이 좋습니다. This link은 형식에 따라 varchar를 datetime으로 변환하는 방법을 보여줍니다.

0

LEFT OUTER JOINCustomer 테이블의 각 행에 대한 행을 생성합니다. wiki article에서 더 잘 볼 수 있습니다. INNER JOIN을 사용하면 해당 주문이있는 고객의 행만 반환됩니다.

0

테스트하지 않고서는 "ordernumber가 null이 아닙니다."는 필요하지 않다고 생각합니다.

당신은 될 겁니다 :

FirstName| LastName| OrderNumber 
John  Smith  1 
John  Smith  2 
Joe  Bloggs NULL  <-- Joe has no orders 

당신이 그것입니다

0

"사람이 어떤 명령이없는 경우에, 저에게 모든 사람과 그들의 주문을 표시 어쨌든 그들에게 보여"입니다. 말 정확하지 않으면 WHERE 조건은 주문이 없으면 거짓으로 평가되므로 주문이없는 고객은 포함되지 않습니다 (고객이 원할 경우에만 3 열의 주문 번호 포함)하기 때문에 모든 고객을 원한다고 가정합니다. 모든 주문을 배치했습니다. ", 그래서 INNER JOIN을 사용하면 다른 사람이 제안하는 것처럼 틀립니다.)

o.ordernumber IS NOT NULL 상태로 놓기를 원할 것입니다.

0

경우 어쩌면 쿼리는 다음과 같이한다 '고객 기록'당신 참 평균 '고객의 주문'에 의해 :

SELECT c.firstname, 
      c.lastname, 
      o.ordernumber 
    FROM Customers c 
LEFT JOIN Orders o ON c.customerid = o.customerid 
     AND o.orderdate > '2010-01-01' 
        /* or '2010-11-01', if you want Nov 1, 2010 */ 

이 출력됩니다 모든 고객. 세 번째 열에는 NULL 또는 주문 번호가 포함됩니다.

고객이 지정된 날짜 이후에 둘 이상의 주문을하면 그 고객의 이름이 매번 다른 주문 번호와 함께 두 번 이상 목록에 나타납니다.

관련 문제