2013-05-04 5 views
0

내가 TOTAL() 집계 함수를 사용하는 SQL 쿼리를 읽기에 ConstraintException을 던져, 빈 행을 반환 쿼리는 결과가없는 경우에도 적어도 하나의 행을 반환하므로 모든 열이 DBNull이됩니다 (가정). 이 쿼리의 결과를 DataTable에로드하려고하면 null 값 때문에 ConstraintException이 발생합니다.SQLite는 쿼리

행을 0 as TotalOrderedAmount으로 대체하면 반환되는 행 수는 0이고 모든 것이 정상적으로 작동합니다.

나는 을 사용해 보았지만, 나는 항상 적어도 하나의 행이 반환되는 것으로 보인다.

제품을 찾을 수 없을 때 집계 함수를 사용하더라도 반환되는 행 수가 0이되도록이 쿼리를 어떻게 수정할 수 있습니까?

+0

가능한 해결 방법은 [이 질문 (에 대한 대답의 확장 방법은 http://stackoverflow.com/questions/ : (결과 기록이있는 경우) 여전히 사용, 하위 쿼리를이 값을 얻으려면 7580929/mysqldatareader-datatable-fillreader-throws-constraintexception) 제약없이 DataTable을로드 할 수 있습니다. – davmos

답변

1

SQL에서 집계 쿼리가 작동하는 방식입니다. SQLite documentation 이것에 대해 말한다 :

SELECT 문이 GROUP BY 절없이 집계 쿼리의 경우, 결과 세트의 각 집계 표현은 전체 데이터 세트에 걸쳐 한 번 평가됩니다. 결과 집합의 각 비 집합 식은 임의로 선택한 행의 데이터 집합에 대해 한 번 평가됩니다. 비 임의 표현식에 대해 동일한 임의로 선택된 행이 사용됩니다. 또는 데이터 집합에 제로 행이 포함 된 경우 각 비 집합 식은 전체적으로 NULL 값으로 구성된 행에 대해 계산됩니다.

결과 집합의 집계 및 비 집계 식을 계산하여 생성 된 결과 집합 데이터의 단일 행은 GROUP BY 절이없는 집계 쿼리의 결과를 형성합니다. GROUP BY 절이없는 집계 쿼리는 입력 데이터가 0 인 행이 있더라도 항상 정확히 한 행의 데이터를 반환합니다.

가 빈 결과를 허용하려면, 당신은 가장 바깥 쪽 쿼리에서 집계 함수 TOTAL를 제거해야합니다.

SELECT 
    c.Id, 
    c.Name, 
    ... 
    b.BatchNumber, 
    (SELECT TOTAL(d.OrderedAmount) 
    FROM SomeTable d 
    WHERE d.x = c.y -- or however d is related to the other tables 
    ) AS TotalOrderedAmount 
FROM OrderProducts a 
JOIN ...    -- without d here 
WHERE ...