2017-01-07 31 views
0

私は2つのテーブルCustomersOrdersをいくつかのデータを持っています。私は顧客からのデータを移入するために必要なビジネス要件が外部結合を左に持って左外部結合を伴うSQL Server再帰クエリ

OrderId CustomerId OrderDate 
------------------------------------------------- 
100   1   2017-01-05 23:16:15.497 
200   4   2017-01-06 23:16:15.497 
300   3   2017-01-07 23:16:15.497 

SELECT * FROM Customers C; 

結果:

CustomerId Name 
--------------------  
1   Shree; 
2   Kalpana; 
3   Basavaraj; 

問合せ:

select * from Orders O; 

結果に繰り返し注文。私は以下の質問と希望のデータを書いています。

SELECT * 
FROM Customers C 
LEFT OUTER JOIN 
    (SELECT * 
    FROM Orders 
    WHERE OrderId = 100) O ON O.CustomerId = C.CustomerId 

UNION ALL 

SELECT * 
FROM Customers C 
LEFT OUTER JOIN 
    (SELECT * 
    FROM Orders 
    WHERE OrderId = 200) O ON O.CustomerId = C.CustomerId 

UNION ALL 

SELECT * 
FROM Customers C 
LEFT OUTER JOIN 
    (SELECT * 
    FROM Orders 
    WHERE OrderId = 300) O ON O.CustomerId = C.CustomerId; 

望ましい結果:

CustomerId Name  OrderId CustomerId OrderDate 
-------------------------------------------------------------------- 
1   Shree  100  1   2017-01-05 23:16:15.497 
2   Kalpana NULL  NULL  NULL 
3   Basavaraj NULL  NULL  NULL 
1   Shree  NULL  NULL  NULL 
2   Kalpana NULL  NULL  NULL 
3   Basavaraj NULL  NULL  NULL 
1   Shree  NULL  NULL  NULL 
2   Kalpana NULL  NULL  NULL 
3   Basavaraj 300  3   2017-01-07 23:16:15.497 

私はループで左外側のクエリを入れて、OrderIdでに合格し、最終的に結果データを保存するためのオプションを持っているが、それが原因で、レコードの数が多いの多くの時間を要し。私はこれを行うための最善の方法を知りたい。私は機能とCTEを試しましたが、これまでの運はありません。助けてください。

事前に感謝します。私はデカルト製品に似た使用してソリューションを持っている

SELECT C.*, 
     OrderId = CASE WHEN C.CustomerId = O.CustomerID THEN O.OrderId ELSE NULL END, 
     CustomerId = CASE WHEN C.CustomerId = O.CustomerID THEN O.CustomerId ELSE NULL END, 
     OrderDate = CASE WHEN C.CustomerId = O.CustomerID THEN O.OrderDate ELSE NULL END 
FROM Orders O, Customers C 
+0

より良い方法でフォーマットすることができたらいいですか、 – sand

+0

ポストコード、XMLまたはデータサンプルを表示するには、テキストエディタで**これらの行を強調表示し、エディタツールバーの "コードサンプル"ボタン( '{}')をクリックする必要があります。 –

+0

あなたの質問はあまり明確ではありません。あなたが望む結果を掲示した結果ですか? –

答えて

0

Aデカルト積は、仕事をすることができます。 CustomerIdをテーブル変数に格納し、デカルト生産量を同じにします。これは私が望むように機能します。

declare @CustomerTable TABLE(ID int IDENTITY(1,1)NOT NULL、CustomerId int); @CustomerTableに挿入すると、ordersから個別CustomerIdを選択します。

選択v.ID、ISNULL CT_CustomerId、v.CustomerId、v.Name、Oなど(v.CT_CustomerId、o.CustomerId)。* (CT_CustomerId、C.CustomerIdとしてCT.ID、CT.CustomerIdを選択してから、@CustomerTable CT、CustomersからのC.Name)V 左外部への結合O O.CustomerId = V.CustomerIdとV.ID = o.ID

+0

親切なヘルプのためのPoluxありがとうございます。私はあなたのコンセプトを使って別の解決策を考え出しました。 – sand

関連する問題