-1

次の2つのテーブルがあります。

A (ID, No1, No2,D)
B (ID, No3, No4,D)

テーブルデータは次のとおりです。

A 表データ

ID = 1, No1 = 23, No2 = 45, D = 1
ID = 2, No1 = 12, No2 = 5, D = 1
ID = 3, No1 = 14, No2 = 4, D = 1
ID = 4, No1 = 41, No2 = 12, D = 1
ID = 5, No1 = 2, No2 = 25, D = 1
ID = 6, No1 = 3, No2 = 96, D = 1

B テーブル データにはデータがありません

次のSQLクエリを渡すと

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS  No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence
FROM dbo.A LEFT 
OUTER JOIN dbo.B ON dbo.A.id = dbo.B.id
GROUP BY dbo.B.No3

その後、次のデータが来ています

No1Sum = 95, No3Sum = 0,  Diffrence = 95

しかし、条件を追加WHEREしてクエリを作成すると、次のクエリにデータが来ません

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence
FROM dbo.A 
LEFT OUTER JOIN dbo.B ON dbo.A.id = dbo.B.id 
WHERE (dbo.A.D = 1) 
AND (dbo.B.D = 1) GROUP BY dbo.B.No3

データが両方のテーブルで優先される場合、結果はたとえば表示されます

No1Sum = 95, No3Sum = 10, Diffrence = 85,

次のクエリを実行すると

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence
FROM dbo.A 
LEFT OUTER JOIN dbo.B 
    ON dbo.A.id = dbo.B.id 
    AND dbo.A.D = 1 
    AND dbo.B.D = 1 
GROUP BY dbo.B.No3

次に、次の結果が表示されます

No1Sum = 570, No3Sum = 0, Diffrence = 570

(A テーブルには 6 つの行があるため、合計は 6 回です)

したがって、両方のテーブルのデータが正確な場合に両方のテーブルから計算する方法ですが、A テーブルにデータがあり、B テーブルにデータがない場合、結果は得られません。

前もって感謝します

4

2 に答える 2

1

2 番目のテーブルにデータがある場合でも、これでうまくいくと思います。

SELECT  ISNULL(SUM(A.No1), 0) AS No1Sum ,
            ISNULL(SUM(B.No3), 0) AS No3Sum ,
            ISNULL(SUM(A.No1), 0) - ISNULL(SUM(B.No3), 0) AS Diffrence
    FROM    A
            LEFT OUTER JOIN B ON A.id = B.id

SELECT 
    ISNULL(SUM(dbo.A.No1), 0) AS No1Sum, 
    ISNULL(SUM(dbo.B.No3), 0) AS No3Sum, 
    ISNULL(SUM(dbo.A.No1), 0) - ISNULL(SUM(dbo.B.No3), 0) AS Diffrence
FROM dbo.A 
LEFT OUTER JOIN dbo.B ON dbo.A.id = dbo.B.id 
WHERE (dbo.A.D = 1) 
AND (dbo.B.D = 1) GROUP BY dbo.B.No3

Bこの条件のため、テーブルにデータがない場合、このクエリはレコードをフェッチしません。

 WHERE (dbo.A.D = 1) AND (dbo.B.D = 1)    

結合に複数の条件を適用するのはオーバーヘッドだと思います。

LEFT OUTER JOIN dbo.B 
    ON dbo.A.id = dbo.B.id 
    AND dbo.A.D = 1 --Overhead
    AND dbo.B.D = 1 --Overhead
于 2013-09-16T14:25:18.730 に答える