0

私はmysqlを初めて使用し、My sqlクエリを記述して、2つのサブクエリで外部結合を作成しようとしましたが、結果が正確な結果を示していません。ここにクエリがあります。

SELECT a.lpcode,a.lpname,a.companycode,a.zone,a.tdy_growr,a.tdy_acres,b.tdate_growr,tdate_acres,a.name
  FROM    (SELECT z.lpcode,
                  x.companycode,
                  z.lpname,
                  z.zone,
                  z.name,
                  count(x.vehicleno) tdy_growr,
                  sum(x.haulagecode) tdy_acres
             FROM gis.registration x, loadingpoint z
            WHERE x.date =
                     (SELECT max(a.date)
                        FROM gis.registration a
                       WHERE     a.fieldno > 0
                             AND a.haulagecode > 0
                             AND a.isaccepted = 1)
                  AND z.lpcode = x.lpcode
                  AND x.fieldno > 0
                  AND x.haulagecode > 0
                  AND x.isaccepted = 1
           GROUP BY x.lpcode) a
       RIGHT OUTER JOIN
          (SELECT r.lpcode,
                  count(r.vehicleno) tdate_growr,
                  sum(r.haulagecode) tdate_acres
             FROM gis.registration r, loadingpoint l
            WHERE r.fieldno > 0 AND r.haulagecode > 0 AND r.isaccepted = 1
            AND r.lpcode = l.lpcode
           GROUP BY l.lpcode) b
       ON a.lpcode = b.lpcode
ORDER BY a.zone, a.lpcode

どんな助けでも前もって感謝するかもしれません

4

1 に答える 1

0

右外部結合のパフォーマンスはひどく、代わりに左外部結合を使用するようにクエリの構造を変更できない場合はそれほど多くありません。これにより、パフォーマンスが向上します。クエリが実行しているのは、結合する行があるかどうかに関係なく、bからすべての行を取得することです。書き直された同じクエリは次のとおりです。

SELECT             a.lpcode,a.lpname,a.companycode,a.zone,a.tdy_growr,a.tdy_acres,b.tdate_growr,a.tdate_acres,a.name
FROM (SELECT r.lpcode,
              count(r.vehicleno) tdate_growr,
              sum(r.haulagecode) tdate_acres
         FROM gis.registration r, loadingpoint l
        WHERE r.fieldno > 0 AND r.haulagecode > 0 AND r.isaccepted = 1
        AND r.lpcode = l.lpcode
       GROUP BY l.lpcode) b
   LEFT OUTER JOIN (SELECT z.lpcode,
              x.companycode,
              z.lpname,
              z.zone,
              z.name,
              count(x.vehicleno) tdy_growr,
              sum(x.haulagecode) tdy_acres
         FROM gis.registration x, loadingpoint z
        WHERE x.date =
                 (SELECT max(a.date)
                    FROM gis.registration a
                   WHERE     a.fieldno > 0
                         AND a.haulagecode > 0
                         AND a.isaccepted = 1)
              AND z.lpcode = x.lpcode
              AND x.fieldno > 0
              AND x.haulagecode > 0
              AND x.isaccepted = 1
       GROUP BY x.lpcode) a
   ON a.lpcode = b.lpcode
ORDER BY a.zone, a.lpcode

これにより、結合するaに一致する行があるかどうかに関係なく、bからのすべての行も提供されます。

問題が次のすべての列でNULLを取得していることである場合: "a.lpcode、a.lpname、a.companycode、a.zone、a.tdy_growr、a.tdy_acres、a.tdate_acres、a.name"すでに使用している構造を使用する必要がありますが、代わりにLEFT OUTER JOINを使用すると、この列「b.tdate_growr」にnullが返される場合があります。

于 2012-06-13T05:06:14.823 に答える