2016-02-26 3 views
0

Я знаю значения для aw_id, ad_id и grp_id (например, aw_id = 5, ad_id = 46 и grp_id = 2).MySQL - Как использовать левый и правый соединения для получения результата

Я хочу, чтобы отобразить все at_cub_details где:

at_cub_details.grp_id = 2 AND 
at_cub_details.cd_id = at_cub_awards.cd_id AND 
at_cub_awards.aw_id = 5 AND 
at_cub_awards.ca_awarded_date IS NULL 
OR at_cub_details.cd_id = at_cub_awards.cd_id AND 
at_cub_awards.aw_id = 5 does not exist 

Where at_cub_details.cd_id = at_cub_awards.cd_id AND 
at_cub_awards.aw_id = 5 AND 
at_cub_awards.ca_awarded_date = NULL does exist **then** 
at_cub_awards.ca_id = at_cub_award_date.ca_id 
AND at_cub_award_date.ad_id = 46 
AND at_cub_award_date.cad_task_completion_date IS NULL OR 
at_cub_awards.ca_id = at_cub_award_date.ca_id AND 
at_cub_award_date.ad_id = 46 does not exist 

Я попробовал всевозможные правые и левые объединения на это без какой-либо удачи.

+0

Можете ли вы показать, что ваша структура данных выглядит наряду с некоторыми образцами данных? Так трудно получить четкую картину. – Ruben

ответ

0

Решение было:

String selectQry = ("SELECT * from (" + 
      "SELECT DISTINCT at_cub_details.cd_id as cdid, " + 
       "at_cub_details.grp_id as grpid, " + 
       "at_cub_details.cd_surname as surname, " + 
       "at_cub_details.cd_first_name as firstName, " + 
       "at_cub_details.cd_dob as dob, " + 
       "at_cub_details.cd_photograph as photograph, " + 
       "at_cub_details.cd_archived as archived, " + 
       "at_cub_details.cd_scout_no as scoutNo " + 
      "FROM at_account_group, at_cub_details " + 
      "LEFT JOIN at_cub_awards ON (at_cub_details.cd_id = at_cub_awards.cd_id AND at_cub_awards.aw_id = ?) " + 
      "WHERE at_cub_awards.cd_id IS NULL " + 
       "AND at_cub_details.grp_id = at_account_group.grp_id " + 
       "AND at_account_group.acc_id = ? " + 

      "UNION " + 
      "SELECT DISTINCT at_cub_details.cd_id as cdid, " + 
          "at_cub_details.grp_id as grpid, " + 
          "at_cub_details.cd_surname as surname, " + 
          "at_cub_details.cd_first_name as firstName, " + 
          "at_cub_details.cd_dob as dob, " + 
          "at_cub_details.cd_photograph as photograph, " + 
          "at_cub_details.cd_archived as archived, " + 
          "at_cub_details.cd_scout_no as scoutNo " + 
      "FROM at_account_group, at_cub_details, at_cub_awards, at_cub_award_date " + 
      "WHERE at_cub_details.grp_id = at_account_group.grp_id " + 
       "AND at_account_group.acc_id = ? " + 
       "AND at_cub_awards.cd_id = at_cub_details.cd_id " + 
       "AND (at_cub_awards.aw_id = ? AND at_cub_awards.ca_awarded_date IS NULL) " + 
       "AND (at_cub_awards.ca_id = at_cub_award_date. ca_id " + 
         "AND at_cub_award_date.cad_task_completion_date IS NULL " + 
         "AND at_cub_award_date.ad_id = ?) " + 

      "UNION " + 
      "SELECT DISTINCT at_cub_details.cd_id as cdid, " + 
          "at_cub_details.grp_id as grpid, " + 
          "at_cub_details.cd_surname as surname, " + 
          "at_cub_details.cd_first_name as firstName, " + 
          "at_cub_details.cd_dob as dob, " + 
          "at_cub_details.cd_photograph as photograph, " + 
          "at_cub_details.cd_archived as archived, " + 
          "at_cub_details.cd_scout_no as scoutNo " + 
      "FROM at_account_group, at_cub_details, at_cub_awards " + 
      "LEFT JOIN at_cub_award_date ON (at_cub_awards.ca_id = at_cub_award_date.ca_id) " + 
      "WHERE at_cub_award_date.ca_id IS NULL " + 
       "AND at_cub_awards.ca_awarded_date IS NULL AND at_cub_awards.aw_id = ? " + 
       "AND at_cub_details.grp_id = at_account_group.grp_id " + 
       "AND at_account_group.acc_id = ? " + 
       "AND at_cub_awards.cd_id = at_cub_details.cd_id " + 

      ") a " + 
      "ORDER BY surname, firstName;"); 
Смежные вопросы