2012-10-25 3 views
1

하위 쿼리/연합에 문제가 있습니다.MySQL 하위 쿼리가 거짓 데이터를 반환합니다.

내가 원하는 것은 다음과 같습니다. 나는 dc_all_orders라고하는 주문에 대해 "백업 테이블"(백업용이 아닌 일부 용도로 사용됩니다)을 가지고 있습니다. 두 개의 다른 테이블 wb_orders 및 wb_printed 있습니다. 순서는 먼저 wb_orders에 도달 한 다음 워크 플로 단계 후에 wb_printed에 들어갑니다. 우리는 일부 주문 항목이 누락 된 것을 보았습니다. 우리는 백업 테이블에 있지만 두 개의 주 주문 테이블에는 없습니다. 영향을받은 orderItem을 계산하려고했습니다. 나는 카운트가 0보다 커야한다는 것을 100 % 알고 있지만 0을 계속 리턴한다. 에 포함되어야하는 항목의 예 :

mysql> select orderId,productId from dc_all_orders where productId = '22040247153891'; 
+---------------------+----------------+ 
| orderId    | productId  | 
+---------------------+----------------+ 
| 20319833369460309A | 22040247153891 | 
+---------------------+----------------+ 
1 row in set (2.06 sec) 


mysql> select * from wb_orders where productId = '22040247153891'; 
Empty set (0.00 sec) 

mysql> select * from wb_printed where productId = '22040247153891'; 
Empty set (0.00 sec) 

이 제품이 표시됩니다. 지금 :

mysql> select count(*) from (select productId from wb_orders UNION select productId from wb_printed) as x; 
+----------+ 
| count(*) | 
+----------+ 
| 4295961 | 
+----------+ 
1 row in set (2 min 51.80 sec) 

그래서 우리는 얼마나 많은 데이터가 있는지 알고 있습니다.

mysql> select count(*) from dc_all_orders WHERE productId NOT IN 
    -> (select productId from wb_orders UNION select productId from wb_printed); 
+----------+ 
| count(*) | 
+----------+ 
|  0 | 
+----------+ 
1 row in set (11 min 9.20 sec) 

설명 할 수 없습니다. 다른 방법으로 시도했지만 모든면에서 0을 보여줍니다. 하위 쿼리의 크기는 모두 생각할 수 있지만 로그를 확인하고 오류가 없으며 결과가 오류없이 반환됩니다.

Am가 분명한가요?

mysql> select count(productId) from dc_all_orders WHERE productId NOT IN (select productId from wb_orders) AND productId NOT IN (select productId from wb_printed); 
+------------------+ 
| count(productId) | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (6 min 3.07 sec) 

편집 : : : 여기

는 다른 방법의 MySQL 버전 : "서버 버전 다음 IUS 커뮤니티 프로젝트에 의해 분산 5.1.65-IUS"는 CentOS는 5.8

+0

이 데이터 유형은 무엇을 참여) ... 수행 할 작업에 따라 group by 또는 distinct를 적용해야 중복을 제거하기 위해? 당신이 정수 오버 플로우에 직면 수있는 것 같습니다 ... –

+0

productId 필드는 varchars 있습니다. –

+0

두 표 중 하나만 포함하면 어떨까요? 그것은 작동합니까? dc_all_orders에서 count (productId)를 선택하십시오. productId가 아닌 경우 (wb_orders에서 productId 선택)] (솔루션을 찾지 못했지만 어떤 일이 발생했는지 확인하는 것입니다) – richardtz

답변

0

나는 천국에 이 부분을 찾지 못했지만, MySQL은 IN (subquery)과 함께 사용할 수있는 하위 쿼리에 크기 제한이있는 것으로 보입니다. 그것은 참조에서 "restrictions on subqueries"에 확실히 언급되지 않았습니다. 그러나 그것은 저에게 전에 일어났습니다. 해결책은 쿼리를 다르게 작성하는 것이 었습니다.

select count(productId) from dc_all_orders a WHERE 
    NOT EXISTS (select 1 from wb_orders o where a.productId = o.productId) 

또는이 조금 까다 롭습니다하지만 주어진 productId 당신 '에 대한 wb_orders에 여러 항목이있는 경우 (하는 LEFT JOIN와 쿼리를 작성할 수 있습니다

예를 들어, 당신은 EXISTS (subquery)를 사용을 시도 할 수 있습니다 중복을 얻을 것이다, 당신은 당신이

select count(distinct a.productId) from dc_all_orders a LEFT JOIN wb_orders o 
    ON a.productId = o.productId WHERE o.id IS NULL 
관련 문제