2011-05-09 2 views
3

누군가이 SQL 쿼리와 어떤 구문이 일치하는지 설명 할 수 있습니까?Strange SQL join

SELECT DISTINCT boats.boatid 
FROM boats LEFT JOIN reservations ON 
reservations.boatid = boats.boatid 
and (@paramFromDate <= reservations.to AND reservations.from <= @paramToDate) 
WHERE reservations.to IS NULL 

테이블 :

**boats** boatid 

**reservations** reservationid, fk_boatid, from, to 

쿼리의 아이디어는 PARAMS로 표시된 기간에 예약되지 않은 보트를 얻는 것입니다. 부분적으로 덮인 범위의 일부분을 가진 보트는 사용할 수 없습니다.

어떻게 "..."코드가 있습니까? 왜 WHERE 키워드와 같은 것이 누락 되었습니까? 거기에 암시 적으로있는 것처럼 보입니까?

+0

maxprice와 minprice는 다음 표 중 어느 것입니까? –

+0

송장이 테이블입니다 – BuzzBubba

+0

최소 금액 <= 500 및 최대 가격> = 100인지 확인하고 계십니까? minprice가 maxprice보다 높은 이유는 무엇입니까? –

답변

5

JOIN을 할 때 여러 기준을 가질 수 있습니다. AND는 "this"와 "that"이 참일 때만 참여하도록 만드는 것입니다. WHERE 절로 이동할 수도 있지만 SQL은 JOIN 조건의 일부인 경우 SQL을 더 잘 최적화 할 수 있습니다. 이 경우는 말할 것도없고 LEFT JOIN으로 인해 다른 결과가 나올 수 있습니다. 나는 어떤 테이블에서 최대 값과 최소값이 오는지 모르기 때문에 말할 수 없습니다.

간단히 말해서, 조인 조건의 일부입니다.

SELECT DISTINCT beverages.beverageid 
FROM beverages 
LEFT JOIN invoices ON invoices.beverageid = beverages.beverageid AND (100 <= maxprice AND minprice <= 500) 
WHERE maxprice IS NULL 

+1

JOIN-ON 표현식의 일부로 'and'를 사용하여 최소 금액을 선택하면 인보이스 행이 결합되는 한도의 일부가됩니다. WHERE 절에있는 경우 '추가'음료 행 - 일치하는 인보이스 행이없는 '행을 제외하므로 내부 참여로'축소 '됩니다. – n8wrl

+0

내가 "AND"를 WHERE로 바꾸거나 "WHERE"를 OR로 사용하면 매우 다릅니다 (잘못된 결과). – BuzzBubba

+0

@ n8wrl : "maxprice IS NULL"로 처리되었으므로 음료를 얻는 부분인데 인보이스가 없다는 의미입니다. – BuzzBubba

1

"and..."(재 작성 그것이 현명 읽기 쉽게 코드 때문에) 당신의 조인 조건의 일부입니다.

1

조건은 조인에 적용됩니다. 먼저 조건에 따라 조인이 수행 된 다음 WHERE가 결과 집합에 적용됩니다.

maxprice가 100 이상이고 최저 가격이 < = 500 인 음료의 목록을 먼저 발견하고 maxprice 및 minprice에 대해 이러한 반환 값 모두에 값 (null이 아님)이 있기 때문에 아무 것도 반환하지 않습니다. 찾을 WHERE 절에 null이 남아 있지 않으므로 빈 집합을 반환합니다.

+0

max와 minprice가 음료수 테이블 –

+0

에서 오는 것이 아닌 한 그들은 그것을하지 않습니다.하지만 동료가 작성한 이전에 사용 된 중첩 된 선택 쿼리의 JOIN 버전입니다. 요점은 쿼리가 다음 중 하나의 음료를 모두 반환한다는 것입니다. - 인보이스에 인보이스가 없습니다 (인보이스에 최소 및 최대 가격 열이 있고 음료수 항목에 대해 여러 인보이스가있을 수 있음) - 인보이스에 범위가있는 인보이스가 있습니다. 100보다 낮거나 500보다 높습니다. – BuzzBubba

0

LEFT JOIN에 추가 조건을 추가하면 실제로 SQL Server에 음료에서 모든 행을 검색하고 maxprice가 100 이상이고 minprice가 100 이상인 일치하는 음료가 들어있는 송장에서 행을 검색하도록 지시합니다 500보다 크거나 같음 OR 조인 조건을 만족하는 행이없는 경우 인보이스에서 행 NULL을 반환합니다.

이 경우 SELECT DISTINCT beverage을 수행 중이므로 LEFT JOIN이 (가) 표면적으로 최적화 된 가능성이 가장 높습니다.

마지막 WHERE은 쿼리에서 대부분의 행을 제거합니다.

+0

나는 그것이 무엇을하는지 알지만 동료가 작성한 이전에 사용 된 중첩 된 선택 쿼리의 JOIN 버전입니다. 요점은 쿼리가 다음 중 하나의 음료를 모두 반환한다는 것입니다. - 인보이스에 인보이스가 없습니다 (인보이스에 최소 및 최대 가격 열이 있고 음료수 항목에 대해 여러 인보이스가있을 수 있음) - 인보이스에 범위가있는 인보이스가 있습니다. 언급 된 범위를 벗어남 : 100보다 낮거나 500보다 높음. – BuzzBubba