-5

これら 2 つの FROM 句は同じ結果を生成しますか? そうでない場合、括弧が不要になるように最初のものを書く方法はありますか?

FROM            SALESTAX
     RIGHT JOIN (            ITEMS
                  RIGHT JOIN (            PINVOICE
                               INNER JOIN PINVDET ON PINVOICE.PNV_INVOICENO = PINVDET.PND_INVOICENO AND PINVOICE.PNV_Site = PINVDET.PND_Site
                             ) ON ITEMS.ITE_INVNO = PINVDET.PND_INVNO
                ) ON SALESTAX.STX_GroupID = PINVDET.PND_TAX1
      FULL JOIN (            CUSTMS
                  RIGHT JOIN CUSMER ON CUSTMS.TMS_CODE = CUSMER.CUS_TERM
                ) ON PINVDET.PND_CUSTID = CUSMER.CUS_CustID

FROM  CUSTMS RIGHT JOIN
      CUSMER ON TMS_CODE = CUS_TERM FULL JOIN
      PINVDET ON PND_CUSTID = CUS_CustID LEFT JOIN
      PINVOICE ON PNV_INVOICENO = PND_INVOICENO AND PNV_Site = PND_Site LEFT JOIN
      SALESTAX on STX_GROUPID = PND_TAX1 left join
      ITEMS on ITE_INVNO = PND_INVNO

編集:最初の質問に対する答えを知りたいのですが、括弧を必要としない最初の FROM 句のより単純なバージョンを持つことにもっとすぐに興味があります。 2つを比較してから、自由にそれを行ってください。

4

2 に答える 2

14

1 番目が 2 番目と同等かどうかはわかりません (1 番目は、クエリが不親切な形式であるためです。控えめに言っても、2 番目は、RIGHT結合を使用して記述するために使用されるため、結合がちょっと混乱するためLEFTです)。しかし、質問に答えるには:

括弧が必要ないように最初のものを書く方法はありますか?

はい、最初のクエリから括弧を削除するだけです。

括弧を保持し、空白でフォーマットします。

FROM 
        SALESTAX
    RIGHT JOIN 
        (   ITEMS
        RIGHT JOIN 
            (   PINVOICE
            INNER JOIN 
                PINVDET 
              ON  PINVOICE.PNV_INVOICENO = PINVDET.PND_INVOICENO 
              AND PINVOICE.PNV_Site = PINVDET.PND_Site
            ) 
          ON ITEMS.ITE_INVNO = PINVDET.PND_INVNO
        ) 
      ON SALESTAX.STX_GroupID = PINVDET.PND_TAX1
    FULL JOIN 
        (   CUSTMS
        RIGHT JOIN
            CUSMER 
          ON CUSTMS.TMS_CODE = CUSMER.CUS_TERM
        ) 
      ON PINVDET.PND_CUSTID = CUSMER.CUS_CustID

括弧と空白をフォーマットしない場合:

FROM    
        SALESTAX
    RIGHT JOIN
            ITEMS
        RIGHT JOIN
                PINVOICE
            INNER JOIN 
                PINVDET 
              ON  PINVOICE.PNV_INVOICENO = PINVDET.PND_INVOICENO
              AND PINVOICE.PNV_Site = PINVDET.PND_Site
          ON ITEMS.ITE_INVNO = PINVDET.PND_INVNO
      ON SALESTAX.STX_GroupID = PINVDET.PND_TAX1
    FULL JOIN
            CUSTMS
        RIGHT JOIN 
            CUSMER 
          ON CUSTMS.TMS_CODE = CUSMER.CUS_TERM
      ON PINVDET.PND_CUSTID = CUSMER.CUS_CustID

2番目のクエリについて、他の質問に答えるには、いいえ、同等ではありません。テーブルのエイリアスを見逃して、内部結合を左結合に変更しました。これは1番目と同等です:

FROM  CUSMER  
        LEFT JOIN
      CUSTMS     ON  CUSTMS.TMS_CODE = CUSMER.CUS_TERM
   FULL JOIN
      PINVDET
        INNER JOIN                                      -- this is changed
      PINVOICE   ON  PINVOICE.PNV_INVOICENO = PINVDET.PND_INVOICENO
                 AND PINVOICE.PNV_Site = PINVDET.PND_Site
        LEFT JOIN
      ITEMS      ON  ITEMS.ITE_INVNO = PINVDET.PND_INVNO
        LEFT JOIN
      SALESTAX   ON  SALESTAX.STX_GroupID = PINVDET.PND_TAX1
   ON PINVDET.PND_CUSTID = CUSMER.CUS_CustID
于 2013-05-23T20:18:53.147 に答える
6

すべての s を最初に配置し、その後に sfromを配置して、節を作成することをお勧めします。これにより、クエリが何を行っているかを把握する試みが大幅に簡素化されます。一連のs は、「すべての行を最初のテーブルに保持する」と言っています。一連の発言は、「テーブル間に一致する行のみを保持する」というものです。(場合によっては、最初の例のようにサブクエリが必要になることがあります。)left joininner joinleft joininner joins

この例では、2 つが同じである可能性は低いです。最初のfull joinは「最も外側の」結合です。2 番目の例でfull joinは、一連の結合に が埋め込まれています。これらは最初から最後まで順番に解釈されます。これらの 1 つは、おそらくをまたはに変換しfull joinています。もちろん、すべてのテーブルが一致する場合、この 2 つは同等の結果を生成する可能性があります。inner joinleft join

2 番目の例は、おそらく次のように記述できます。

FROM  CUSMER  LEFT JOIN
      CUSTMS ON TMS_CODE = CUS_TERM LEFT JOIN
      PINVDET ON PND_CUSTID = CUS_CustID LEFT JOIN
      PINVOICE ON PNV_INVOICENO = PND_INVOICENO AND PNV_Site = PND_Site LEFT JOIN
      SALESTAX on STX_GROUPID = PND_TAX1 left join
      ITEMS on ITE_INVNO = PND_INVNO

( の後の何かがそれをとにかくfull joinに変換していると仮定します)。left join

于 2013-05-23T20:19:07.240 に答える