MySQL - избегать декартовых продуктов при запросах?

У меня есть две таблицы X и Y , мне нужно общее количество строк, которые были закрыты (fd_sts_cd = 'C') сегодня (fulfill_date = CURRENT_DATE).

В БД есть данные

select *
from prdsbtmb_mbr_add_info
where fd_sts_cd = 'C' and mbr_id_no='9292138102'-> **12 rows**.

select *
from prdsbtfa_ffl_attempt
where nxt_ffl_dt = CURRENT_DATE and mbr_id_no='9292138102' -> **41 rows**

в то время как присоединиться к ним результат пришел по-другому

SELECT COUNT(*)
FROM X a, Y b 
WHERE b.fulfill_date = CURRENT_DATE AND
      a.id = b.id AND
      a.fd_sts_cd = 'C' -> RESULT COUNT::**492**(12*41)

Я пробовал все соединения INNER, LEFF, OUTER JOININGS, но результат тот же.

Не могли бы вы объяснить мне
Как мы можем избежать этого декартова произведения и почему оно вычисляется именно так? И есть ли какое-либо решение, чтобы избежать этого, предложите мне?

Спасибо!!


person user3345206    schedule 15.03.2017    source источник
comment
Образцы данных и желаемые результаты помогут объяснить, что вы хотите сделать.   -  person Gordon Linoff    schedule 15.03.2017
comment
Ваш второй запрос не соответствует именам полей из первого. ¿Что случилось с mbr_id_no? Должен ли он быть одинаковым для обеих таблиц?   -  person ffflabs    schedule 15.03.2017
comment
Да, имя столбца mbr_id_no одинаково в обеих таблицах   -  person user3345206    schedule 15.03.2017


Ответы (1)


Вы не можете сделать это, используя join. join производит декартово произведение.

Простой способ — просто использовать подзапросы в предложении select:

select ( (select count(*)
          from prdsbtmb_mbr_add_info
          where fd_sts_cd = 'C' and mbr_id_no = '9292138102'
         ) + 
         (select count(*)
          from prdsbtfa_ffl_attempt
          where nxt_ffl_dt = CURRENT_DATE and mbr_id_no = '9292138102'
         )
        ) as total
person Gordon Linoff    schedule 15.03.2017
comment
Но в приведенном выше запросе я не использую какое-либо право соединения, поэтому результат был декартовым запросом: SELECT COUNT (*) FROM X a, Y b WHERE b.fulfill_date = CURRENT_DATE AND a.id = b.id AND a.fd_sts_cd = ' С'. - person user3345206; 16.03.2017
comment
и mbr_id_no не является фиксированным значением, по моим критериям оно должно быть равным (одинаковым) в двух таблицах - person user3345206; 16.03.2017
comment
@user3345206 . . . Можно только задать вопрос, который вы задаете. В этом вопросе это фиксированное значение. Если у вас есть другой вопрос, задайте другой вопрос с примерами данных и желаемыми результатами. - person Gordon Linoff; 16.03.2017