저는 SQL 쿼리에 혼란 스럽습니다. 솔직히 말해서, Google에 대한 방법조차 잘 모르는 것들 중 하나입니다. 따라서 StackOverflow.이 하위 쿼리로 인해 오류가 발생하지 않는 이유는 무엇입니까?
나는 간단한 쿼리라고 생각합니다.
SELECT Id
FROM Customer
WHERE Id IN (SELECT Id from @CustomersWithCancelledOrders)
여기 내가 이상한 점을 발견했습니다. @CustomersWithCancelledOrders 테이블 변수에 Id라는 열이 없습니다. 그러나 오류는 없습니다.
이 결과는 모든 고객의 ID입니다. 매 하나마다. 분명히 처음부터 서브 쿼리를 수행하는 것이 어려워집니다.
외부 테이블 (Customers)의 Id 열을 사용하는 것과 비슷하지만 왜 그렇게 할 수 있는지 이해할 수 없습니다. 당신이 그렇게하기를 원할 이유가 있습니까? 나는 엄청나게 분명한 것을 놓치고 있는가?
SQLFiddle 이상한. 해당 웹 사이트에서 여러 결과 집합을 반환 할 수있는 방법을 찾지 못해서 최고의 SQL Fiddle이 아니지만 문제를 어떻게 만났는지를 보여줍니다.
위의 "기능"에 대한 이름이 무엇인지, 왜 그것이 무엇인지, 그리고 잘못된 쿼리가 실제로 무엇을 의미하는지에 대한 정보가 있습니다.
나는 위의 질문을 약간 더 나은 예를 사용하도록 업데이트했습니다. 그것도 여전히 고안되었지만 실제로 문제가 발생했을 때 제가 쓴 스크립트에 더 가깝습니다.
상관 하위 쿼리에 대한 몇 가지 독서를하고 후에는 (서브 쿼리에서 잘못된 ID 열을 사용) 내 오타처럼 보이는 하위 쿼리의 동작을 변경합니다.
하위 쿼리의 결과를 한 번 평가 한 다음 그 결과를 집합으로 처리하는 대신 (의도 한대로) 외부 쿼리의 모든 행에 대해 하위 쿼리를 평가합니다.
이것은 하위 쿼리가 모든 행에 대해 서로 다른 결과 집합으로 평가되며 그 결과 집합에는 해당 행의 고객 ID가 보장됩니다. 부속 조회는 행 X의 x 번 반복 된 ID로 구성된 세트를 리턴합니다. 여기서 X는 선택되는 테이블 변수의 행 수입니다.
...그것 정말 열심히이 문제에 대한 이해의 간결한 설명을 작성합니다. 죄송합니다. 나는 내가 지금 좋다라고 생각한다.
우연히 알기가 어렵거나 유효한 케이스를 간소화했는데 대부분 하위 쿼리를 사용하는 대신 테이블을 조인해야합니다. – JamesRyan
찾고있는 전문 용어는'상관 된 하위 쿼리 '입니다. – Brandon
@JamesRyan 나는 어제 빠른 쿼리를 작성했고 우연히 위와 유사한 업데이트 쿼리를 작성했습니다. 하위 쿼리에서 외부 ID를 사용하는 것은 오타였으며 의도 한 하위 집합 대신 테이블의 모든 레코드를 업데이트 할 때 매우 놀랐습니다. –