2010-06-16 1 views
1

문제가 있습니다. 나는 쿼리를하려고 해요 ... 나는 과거에 내가 이런 짓을했음을 기억하지만 오늘이 쿼리는 아무것도 반환하지 않고, 아무런 데이터도없고, 아무 것도 ... 쿼리는 다음과 같습니다.조건 (저장 프로 시저)에 변수가 포함 된 쿼리를 만드는 동안 발생하는 문제

당신이 볼 수 있듯이

 

SELECT field1, @variableX:=field2, 
@variableY:=(SELECT COUNT(fieldA) FROM table2 WHERE [email protected] AND fieldC=0), 
@variableZ:=(SELECT COUNT(fieldA) FROM table2 WHERE [email protected] AND fieldC=4) 
FROM table 
WHERE @variableY>0 AND @variableZ=0; 
 

, 나는 1 쿼리 할 노력하고있어 어떤 것은을 사용할 수 있습니다 : (또한 오류를 gaves 없음)

 

SELECT field1, @variableX:=field2 
FROM table 
WHERE 
    (SELECT COUNT(fieldA) FROM table2 WHERE [email protected] AND fieldC=0)>0 AND 
    (SELECT COUNT(fieldA) FROM table2 WHERE [email protected] AND fieldC=4)=0; 
 

는 또한이 쿼리를 시도했지만 작동하지 않았다 조건 변수. 두 번째 쿼리에서 일부 변수를 만들고 조건에서 평가하려고합니다. 마지막 두 번째 쿼리에서 @ variableY = 1 AND @ variableZ = 0 그러나 쿼리가 빈 데이터 집합을 반환하는 이유를 모르겠습니다.

무엇이 잘못 될 수 있습니까 ??? 모든 의견이나 제안을 환영합니다 !!! 감사!!! 안녕!

답변

0

IIRC, 선택 필드는 where 절이 충족 된 후에 만 ​​실행됩니다. 그래서 @variableX은 항상 당신이 할 수있는 (내가 제대로 이해 경우) 같은 쿼리 where 절의 전체 실행 ... 동안 비어있을 것입니다 :

SELECT field1, field2 
FROM table AS a 
WHERE 
    (SELECT COUNT(fieldA) FROM table2 WHERE fieldB=a.field2 AND fieldC=0)>0 AND 
    (SELECT COUNT(fieldA) FROM table2 WHERE fieldB=a.field2 AND fieldC=4)=0; 
+0

감사합니다 !!!! 그것은 작동한다! !!! 나는 그것을 몰랐다. 그러나 지금 나는 알고있다! !!! 고마워요 !!! – pablomarti

2

당신은 필요하지 않습니다를 변수, 서브 쿼리, 또는 COUNT는이 문제를 해결합니다.

SELECT DISTINCT t1.field1, t1.field2 
FROM mytable t1 
INNER JOIN mytable2 t2 ON t1.field2 = t2.fieldB AND t3.fieldC = 0 
LEFT OUTER JOIN mytable2 t3 ON t1.field2 = t3.fieldB AND t3.fieldC = 4 
WHERE t3.fieldB IS NULL 

t2의 경우 0이 아닌 일치 항목을 원했지만 내부 조인을 만족하면 true입니다.

그리고 외부 조인이 이 아니고이 아닐 경우 (따라서 t3. *은 NULL입니다) t3 경우에 대해 일치하는 항목을 원했습니다.


@ircmaxell은 행이 WHERE 절에 조건을 통과에만 후 선택 목록에 식을 평가하는 것이 올바른 것입니다. 선택 목록에 비용이 많이 드는 표현식이 있지만 WHERE 절이 행의 99 %를 필터링하려고하면 모든 행에 대해 값 비싼 선택 목록 표현식을 평가하는 것이 낭비입니다. 그들을 버리십시오.

+0

감사합니다 !!! 이것은 더 복잡하다 !! 나는 당신이 가입을 사용할 때 당신이 aditional params를 추가 할 수 있다는 것을 알지 못했다 !! – pablomarti

관련 문제