2012-06-13 3 views
0

Я новичок в MySQL и иметь запрос My SQL написал и пытаюсь сделать внешнее соединение с двумя подзапросов, но результаты не показывают точные результаты здесь является запросMysql правое внешнее соединение не работает 100%

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 

Любая помощь может быть оценена заранее

+0

Без дополнительной информации о том, что вы ожидаете, и почему, по вашему мнению, результаты ошибочны, я сомневаюсь, что вы получите большую помощь. – madth3

ответ

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 

Это также дает все строки из б, независимо от того, имеется соответствующая строка в, чтобы присоединиться.

Если проблема заключается в том, что вы получаете NULLS во всех этих столбцах: «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 »

Смежные вопросы