2011-08-12 3 views
4

이 쿼리를 실행하면 모든 [데이터]. * 값이 NULL로 나타납니다. 나는 각 [data].levelX_id = 0 이전 1=1 AND을 추가하는 경우 은 잘 작동, 그냥 테스트,SQL-CE 가능한 버그?

SELECT 
    [map].*, 
    [data].* 
FROM 
    f_normalised_report_hierarchy  AS [map] 
LEFT JOIN 
    f_normalised_report_data   AS [data] 
    ON (([data].level1_id = [map].level1_id) OR ([data].level1_id = 0)) 
    AND (([data].level2_id = [map].level2_id) OR ([data].level2_id = 0)) 
    AND (([data].level3_id = [map].level3_id) OR ([data].level3_id = 0)) 
    AND (([data].level4_id = [map].level4_id) OR ([data].level4_id = 0)) 
    AND (([data].level5_id = [map].level5_id) OR ([data].level5_id = 0)) 
    AND (([data].level6_id = [map].level6_id) OR ([data].level6_id = 0)) 
    AND ([data].metric_id = 22) 
WHERE 
    [map].level1_id = 22 


그러나 년대 * 무시!?!?

SELECT 
    [map].*, 
    [data].* 
FROM 
    f_normalised_report_hierarchy  AS [map] 
LEFT JOIN 
    f_normalised_report_data   AS [data] 
    ON (([data].level1_id = [map].level1_id) OR (1=1 AND [data].level1_id = 0)) 
    AND (([data].level2_id = [map].level2_id) OR (1=1 AND [data].level2_id = 0)) 
    AND (([data].level3_id = [map].level3_id) OR (1=1 AND [data].level3_id = 0)) 
    AND (([data].level4_id = [map].level4_id) OR (1=1 AND [data].level4_id = 0)) 
    AND (([data].level5_id = [map].level5_id) OR (1=1 AND [data].level5_id = 0)) 
    AND (([data].level6_id = [map].level6_id) OR (1=1 AND [data].level6_id = 0)) 
    AND ([data].metric_id = 22) 
WHERE 
    [map].level1_id = 22 


내가 거의 그것이 작동되도록하는 퍼지으로 그와 함께 살 수 있지만, 지금 실행하는 데 영원히 소요됩니다. (6 분이 지났을 때 1 초 미만에서 '계속 달리다'까지)

나는 바인딩됩니까? 아니면 SQL CE가 로커가 아닌가?

편집

나는 조건을 반전하는 경우 :

AND (([data].level6_id = [map].level6_id) OR ([data].level6_id = 0)) 

AND (([data].level6_id = 0) OR ([data].level6_id = [map].level6_id)) 

에 그때 다른 동작을 얻을.


대신 내가 사용하는 경우 IN는 :

AND ([data].level6_id IN ([map].level6_id,0)) 

나는 아직도 다른 동작을 얻을. 확실히 내가 코딩하지 어떤 의미, 그리고 행동의


없음.

+0

조건에있는 표현식이 모두 null입니까? – bobs

+0

아니요. 만약 그들이 (1 = 1 AND NULL = 0)했다면 여전히'NULL'을 줄 것입니다. – MatBailie

+0

샘플 데이터를 얻을 수 있습니까? –

답변

3

나는이 가능성이 느린 것 같은데요,하지만 난이 쿼리는 모두 작동있어 :

SELECT 
    * 
FROM 
    f_normalised_report_hierarchy  AS [map] 
LEFT JOIN 
    f_normalised_report_data   AS [data] 
     ON ([data].level1_id = [map].level1_id OR [data].level1_id*1 = 0) 
     AND ([data].level2_id = [map].level2_id OR [data].level2_id*1 = 0) 
     AND ([data].level3_id = [map].level3_id OR [data].level3_id*1 = 0) 
     AND ([data].level4_id = [map].level4_id OR [data].level4_id*1 = 0) 
     AND ([data].level5_id = [map].level5_id OR [data].level5_id*1 = 0) 
     AND ([data].level6_id = [map].level6_id OR [data].level6_id*1 = 0) 
; 

그리고

SELECT 
    * 
FROM 
    f_normalised_report_hierarchy  AS [map] 
LEFT JOIN 
    f_normalised_report_data   AS [data] 
     ON ([data].level1_id = [map].level1_id OR cast([data].level1_id as int) = 0) 
     AND ([data].level2_id = [map].level2_id OR cast([data].level2_id as int) = 0) 
     AND ([data].level3_id = [map].level3_id OR cast([data].level3_id as int) = 0) 
     AND ([data].level4_id = [map].level4_id OR cast([data].level4_id as int) = 0) 
     AND ([data].level5_id = [map].level5_id OR cast([data].level5_id as int) = 0) 
     AND ([data].level6_id = [map].level6_id OR cast([data].level6_id as int) = 0) 
; 

편집을 콤팩트 4를가 만드는 경우 차이.

+0

월요일에 시도해 볼 수는 있지만, 실행 계획이 테이블을 사용하도록 변경 될 가능성이 있기 때문에 희망이 없습니다. 인덱스 검색/스캔보다는 스캔 : ( – MatBailie

1

제 해결책은 SQL-CE를 포기하고 클라이언트의 메모리에 조인하는 것입니다.

마지막 옵션은 작동하는 유일한 옵션이며 두 테이블의 전체 스캔으로 인해 실제 데이터의 성능이 좋지 않았습니다.

CREATE TABLE f_normalised_report_data (
    level1_id  INT, 
    level2_id  INT, 
    level3_id  INT, 
    level4_id  INT, 
    level5_id  INT, 
    level6_id  INT, 
    metric_id  INT, 
    value   MONEY, 
    PRIMARY KEY (
     level1_id, 
     level2_id, 
     level3_id, 
     level4_id, 
     level5_id, 
     level6_id, 
     metric_id 
    ) 
) 
; 

CREATE TABLE f_normalised_report_hierarchy (
    level1_id  INT, 
    level2_id  INT, 
    level3_id  INT, 
    level4_id  INT, 
    level5_id  INT, 
    level6_id  INT, 
    PRIMARY KEY (
     level1_id, 
     level2_id, 
     level3_id, 
     level4_id, 
     level5_id, 
     level6_id 
    ) 
) 
; 

INSERT INTO f_normalised_report_hierarchy SELECT 1, 2, 3, 4, 5, 6; 
INSERT INTO f_normalised_report_hierarchy SELECT 1, 2, 3, 4, 5, 7; 

INSERT INTO f_normalised_report_data  SELECT 1, 2, 3, 0, 5, 6, 22, 999; 
INSERT INTO f_normalised_report_data  SELECT 1, 2, 3, 0, 5, 7, 22, 911; 

SELECT 
    * 
FROM 
    f_normalised_report_hierarchy  AS [map] 
LEFT JOIN 
    f_normalised_report_data   AS [data] 
     ON ([data].level1_id = [map].level1_id OR [data].level1_id = 0) 
     AND ([data].level2_id = [map].level2_id OR [data].level2_id = 0) 
     AND ([data].level3_id = [map].level3_id OR [data].level3_id = 0) 
     AND ([data].level4_id = [map].level4_id OR [data].level4_id = 0) 
     AND ([data].level5_id = [map].level5_id OR [data].level5_id = 0) 
     AND ([data].level6_id = [map].level6_id OR [data].level6_id = 0) 
; 
-- The above query gives me this... 
-- 1, 2, 3, 4, 5, 6, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL 
-- 1, 2, 3, 4, 5, 7, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL 

SELECT 
    * 
FROM 
    f_normalised_report_hierarchy  AS [map] 
LEFT JOIN 
    f_normalised_report_data   AS [data] 
     ON ([data].level1_id = 0 OR [data].level1_id = [map].level1_id) 
     AND ([data].level2_id = 0 OR [data].level2_id = [map].level2_id) 
     AND ([data].level3_id = 0 OR [data].level3_id = [map].level3_id) 
     AND ([data].level4_id = 0 OR [data].level4_id = [map].level4_id) 
     AND ([data].level5_id = 0 OR [data].level5_id = [map].level5_id) 
     AND ([data].level6_id = 0 OR [data].level6_id = [map].level6_id) 
; 
-- The above query gives me this... 
-- 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 0, 6, 22, 999 
-- 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 0, 7, 22, 911 
-- 1, 2, 3, 4, 5, 7, 1, 2, 3, 4, 0, 6, 22, 999 
-- 1, 2, 3, 4, 5, 7, 1, 2, 3, 4, 0, 7, 22, 911 


SELECT 
    * 
FROM 
    f_normalised_report_hierarchy  AS [map] 
LEFT JOIN 
    f_normalised_report_data   AS [data] 
     ON ([data].level1_id IN ([map].level1_id, 0)) 
     AND ([data].level2_id IN ([map].level2_id, 0)) 
     AND ([data].level3_id IN ([map].level3_id, 0)) 
     AND ([data].level4_id IN ([map].level4_id, 0)) 
     AND ([data].level5_id IN ([map].level5_id, 0)) 
     AND ([data].level6_id IN ([map].level6_id, 0)) 
; 
-- The above query gives me this... 
-- 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 0, 6, 22, 999 
-- 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 0, 7, 22, 911 
-- 1, 2, 3, 4, 5, 7, 1, 2, 3, 4, 0, 6, 22, 999 
-- 1, 2, 3, 4, 5, 7, 1, 2, 3, 4, 0, 7, 22, 911 


SELECT 
    * 
FROM 
    f_normalised_report_hierarchy  AS [map] 
LEFT JOIN 
    f_normalised_report_data   AS [data] 
     ON ([data].level1_id = [map].level1_id OR (1=1 AND [data].level1_id = 0)) 
     AND ([data].level2_id = [map].level2_id OR (1=1 AND [data].level2_id = 0)) 
     AND ([data].level3_id = [map].level3_id OR (1=1 AND [data].level3_id = 0)) 
     AND ([data].level4_id = [map].level4_id OR (1=1 AND [data].level4_id = 0)) 
     AND ([data].level5_id = [map].level5_id OR (1=1 AND [data].level5_id = 0)) 
     AND ([data].level6_id = [map].level6_id OR (1=1 AND [data].level6_id = 0)) 
; 
-- The above query gives me this... 
-- 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 0, 6, 22, 999 
-- 1, 2, 3, 4, 5, 7, 1, 2, 3, 4, 0, 7, 22, 911 
-- 
-- Which is correct, but performance was blown to smitherines. 
+1

Microsoft에 버그 보고서를 제출 했습니까? https://connect.microsoft.com/VisualStudio/Feedback (피드백을 제출하려면 로그인해야합니다.) – devuxer

관련 문제