2011-08-12 11 views
4

このクエリを実行すると、[data]。*の値はすべてNULLとして出力されます。私は、各[data].levelX_id = 01=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 


私はほとんどそれを動作させるためにファッジとしてそれと一緒に暮らすことができ、それが今で実行するように永遠にかかります。 (1秒未満から6分後に「まだ稼働中」まで)

私はバインドされていますか?それとも、SQL CEがロッカーであるのですか?

EDIT

私は条件を逆にした場合:

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

Nope。彼らが '(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) 
; 

EDITをコンパクトな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

関連する問題