2017-12-20 20 views
-2

私はいくつかの助けを借りています。私はSQLを初めて使っています。これらを以下のクエリに結合するのに役立ちますか?最初のクエリのすべてのデータを表示し、 2番目のクエリで示しました。クエリSQL Serverへの参加

パートとSUBKEY1は

ありがとう結合です。

SELECT RHeads.[Document], 
    RLines.Part, 
    RHeads.Supp, 
    RHeads.DATETIME, 
    RLines.Unit, 
    RLines.CQty, 
    RHeads.POrder, 
    RHeads.Corder, 
    RHeads.Branch 
FROM RLines 
    RIGHT OUTER JOIN RHeads ON RLines.[Document] = RHeads.[Document] 
WHERE (RHeads.DATETIME >= DATEADD(MONTH, - 3, GETDATE())) 
    AND (RHeads.Corder = '02022076') 
ORDER BY RHeads.DATETIME DESC; 

SELECT Mvpr.Prefix, 
    Mvpr.SubKey1, 
    Mvpr.SubKey2, 
    Mvpr.A12 
FROM Mvpr 
    INNER JOIN vwProduct ON Mvpr.SubKey1 = vwProduct.KeyCode 
WHERE (Mvpr.Prefix = 'c'); 
+0

「一致する情報」を定義します。両方のクエリの列には種類の関係がないようです。 –

答えて

0

ジャスト(括弧を使用して)自分のサブクエリの中にこれらのSQL文の両方を固執し、我々はそれが結果メインクエリに設定されていますを参照できるように、各サブクエリにエイリアスを与える:私たちは「

SELECT 
    t1.*, 
    t2.* 
FROM 
    (
     SELECT RHeads.[Document], 
      RLines.Part, 
      RHeads.Supp, 
      RHeads.DATETIME, 
      RLines.Unit, 
      RLines.CQty, 
      RHeads.POrder, 
      RHeads.Corder, 
      RHeads.Branch 
     FROM RLines 
      RIGHT OUTER JOIN RHeads ON RLines.[Document] = RHeads.[Document] 
     WHERE (RHeads.DATETIME >= DATEADD(MONTH, - 3, GETDATE())) 
      AND (RHeads.Corder = '02022076') 
    ) t1 
    LEFT OUTER JOIN 
    (
     SELECT Mvpr.Prefix, 
      Mvpr.SubKey1, 
      Mvpr.SubKey2, 
      Mvpr.A12 
     FROM Mvpr 
      INNER JOIN vwProduct ON Mvpr.SubKey1 = vwProduct.KeyCode 
     WHERE (Mvpr.Prefix = 'c') 
    ) t2 ON t1.Part = t2.SubKey1 
ORDER BY t1.DATETIME DESC; 

LEFT OUTER JOINを使用して、すべてのレコードをt1(最初のクエリ)から取得し、一致するレコードのみをt2(2番目のクエリ)から取得します。

また、ORDER BY句をメインクエリに移動したため、サブクエリの内部でORDERを実行できません(また、許可されていても、結合後に順序が失われて余分なものになります)。

ここで集計を行っていないので、おそらくサブクエリなしでこれを書き直すこともできます。

私はあなたのデータに関するいくつかの仮定をしたが、おそらくのようなものました:あなたが第一クエリの粒度はCTEの中に入れて維持し、存在を確認したい場合は

SELECT RHeads.[Document], 
     RLines.Part, 
     RHeads.Supp, 
     RHeads.DATETIME, 
     RLines.Unit, 
     RLines.CQty, 
     RHeads.POrder, 
     RHeads.Corder, 
     RHeads.Branch, 
     Mvpr.Prefix, 
     Mvpr.SubKey1, 
     Mvpr.SubKey2, 
     Mvpr.A12 
    FROM RHeads 
     LEFT OUTER JOIN RLines 
      ON RLines.[Document] = RHeads.[Document]   
     LEFT OUTER JOIN vwProduct 
      ON Mvpr.SubKey1 = vwProduct.KeyCode 
     LEFT OUTER JOIN Mvpr 
      ON vwProduct.KeyCode = Mvpr.Subkey1 
      AND Mvpr.Prefix = 'c' 
WHERE 
    RHeads.DATETIME >= DATEADD(MONTH, - 3, GETDATE()) 
    AND RHeads.Corder = '02022076' 
0

;WITH Q1 AS(
    SELECT RHeads.[Document], 
     RLines.Part, 
     RHeads.Supp, 
     RHeads.DATETIME, 
     RLines.Unit, 
     RLines.CQty, 
     RHeads.POrder, 
     RHeads.Corder, 
     RHeads.Branch 
    FROM RLines 
     RIGHT OUTER JOIN RHeads ON RLines.[Document] = RHeads.[Document] 
    WHERE (RHeads.DATETIME >= DATEADD(MONTH, - 3, GETDATE())) 
     AND (RHeads.Corder = '02022076')  
), Q2 AS (
    SELECT Mvpr.Prefix, 
     Mvpr.SubKey1, 
     Mvpr.SubKey2, 
     Mvpr.A12 
    FROM Mvpr 
     INNER JOIN vwProduct ON Mvpr.SubKey1 = vwProduct.KeyCode 
    WHERE (Mvpr.Prefix = 'c') 
) 
SELECT q1.* 
FROM Q1 q1 
WHERE EXISTS(
    SELECT * 
    FROM Q2 q2 
    WHERE q1.Part = q2.SubKey1 
) 
ORDER BY q1.DATETIME DESC