2017-01-05 11 views
0

INNER JOINを使用して複数のテーブルを結合しようとしています。ここでインナー結合がSQL Serverのクロス結合として機能するのはなぜですか?

はコード

IF OBJECT_ID('tempdb..#tmpRecData') IS NOT NULL 
    DROP TABLE #tmpRecData 

--STEP 1 
SELECT DISTINCT 
    pr.ChainID, pr.StoreID, pr.SupplierID, pr.ProductID, 
    MAX(CAST(pr.ActiveLastDate AS date)) AS 'Active Date' 
    --ChainID, SupplierID, StoreID, InvoiceDate, InvoiceNumber, SupplierInvoiceDate, SupplierInvoiceNumber 
INTO 
    #tmpRecData 
FROM 
    dbo.[ProductPrices_Retailer] AS pr 
LEFT JOIN 
    ProductIdentifiers iden ON pr.ProductID = iden.ProductID 
          AND iden.ProductIdentifierTypeID = 2 
WHERE 
    pr.ChainID = '119121' 
    AND pr.ActiveLastDate > '12/01/2016'     
GROUP BY 
    pr.ProductID, pr.ProductName, iden.IdentifierValue, 
    pr.ChainID, pr.StoreID, pr.SupplierID 

--STEP 2 
SELECT 
    rec.ChainID, rec.StoreID, rec.SupplierInvoiceNumber, 
    rec.TransactionTypeID, rec.SupplierID, rec.SaleDateTime, 
    rec.ProductID, rec.UPC, rec.ProductDescriptionReported, 
    rec.RawProductIdentifier 
FROM 
    #tmpRecData t 
INNER JOIN 
    dbo.StoreTransactions AS rec WITH (NOLOCK) ON rec.ChainID = T.ChainID 
WHERE 
    rec.ChainID = '119121' 

DROP TABLE #tmpRecData 

私は取得していますで4096(ステップ1)* 145979(ステップ2)= 725077693行(7.25億)

これは、レコードの膨大な数があるが、私はINNER JOINを使用しています、なぜそれがクロスジョインとして機能したのですか?

+4

STEP2で同様のproductIDに参加する必要がある - それらはすべてwhere句に基づいて、同じchainIDを持っています。 ON句に追加する必要があるデータをリンクする他の列はありますか? –

+0

はい、他のいくつかの列が参加していましたが、私たちは0のレコードを取得していました。 ChainIDはデータを与えた唯一の結合基準でした –

+1

@PraveenSingh正しいものを推測するまで、すべての列を結合基準として試すことはできません。あなたは0レコードを取得している場合、おそらくあなたは0レコードを取得するはずですか? –

答えて

0

CROSS JOINはINNER JOINと大きく異なります。インナー

クロス結合結合テーブルの両方にマッチ..を有するディスプレイ行のみをJOIN

は、ジョイン内のテーブルのデカルト積を生成します。結果の行数は、第1の表の行数に第2の表の行数を掛けた数です。

+0

はい、ステップ1で4096レコードを取得し、その後、私は4096レコードのみを取得する必要があります。しかし、私たちのDBAは、それがすでにCROSS JOINとして働いていると言います –

0

これを実行するには、手順2の店舗IDに参加する必要があります。すべての店舗でchainIDが実行されているため、レコード数が多すぎます。製品はまた、一致させる必要がある場合は、あなたが唯一のChainIDに参加している

IF OBJECT_ID('tempdb..#tmpRecData') IS NOT NULL DROP TABLE #tmpRecData 

--STEP 1 
    SELECT DISTINCT pr.ChainID,pr.StoreID,pr.SupplierID,pr.ProductID, MAX(CAST(pr.ActiveLastDate AS date)) AS 'Active Date' 
    --ChainID, SupplierID, StoreID, InvoiceDate, InvoiceNumber, SupplierInvoiceDate, SupplierInvoiceNumber 
     INTO #tmpRecData 
     FROM dbo.[ProductPrices_Retailer] AS pr 
      LEFT JOIN ProductIdentifiers iden 
        ON pr.ProductID=iden.ProductID 
        AND iden.ProductIdentifierTypeID=2 
     WHERE pr.ChainID='119121' 
       AND pr.ActiveLastDate>'12/01/2016'     
     GROUP BY pr.ProductID,pr.ProductName,iden.IdentifierValue,pr.ChainID,pr.StoreID,pr.SupplierID 


--STEP 2 

SELECT rec.ChainID,rec.StoreID,rec.SupplierInvoiceNumber,rec.TransactionTypeID,rec.SupplierID,rec.SaleDateTime, 
     rec.ProductID,rec.UPC,rec.ProductDescriptionReported,rec.RawProductIdentifier 
    FROM #tmpRecData t 
    INNER JOIN dbo.StoreTransactions AS rec WITH (NOLOCK) 
     ON rec.ChainID=T.ChainID and rec.StoreID = T.storeID 
    WHERE rec.ChainID='119121' 

    DROP TABLE #tmpRecData 
+0

私はすでに同意して試しましたが、チェーンIDと店舗IDを持つ一致するレコードはありませんでした。 –

関連する問題