У меня есть запрос, который выполняет 2 ЛЕВЫХ соединения и 1 ГРУППИРОВКУ ПО, но я получаю недостающие результаты:

#ms-access

#ms-access

Вопрос:

Следующий запрос должен вернуть около 1159 результатов, но возвращает только около 880 результатов; Если я присоединяю только ширину «c» «mm», я все равно получаю 1159 результатов. Только когда все 3 таблицы, я получаю 880 результатов. Я также безуспешно использовал: ПРАВОЕ СОЕДИНЕНИЕ, ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Я пытался с «()» и без «()» в синтаксисе объединения, но тоже безуспешно.

Любая помощь приветствуется

 SELECT c.ccod, c.cetcm, c.cdscr, c.cpcul, c.cdent, mm.amexi,

Sum(CASE WHEN m.mcdmv=11 THEN m.mqtd END),

Sum(CASE WHEN m.mcdmv=2 THEN m.mqtd END),

Sum(CASE WHEN m.mcdmv=13 THEN m.mqtd END),
Sum(CASE WHEN m.mcdmv=14 THEN m.mqtd END),

MAX(CASE WHEN m.mcdmv=82 THEN m.mdata END)



FROM 
(zzz.ccc c 
LEFT JOIN zzz.mmmm mm ON c.crnp = mm.arncd)
LEFT JOIN zzz.mm m ON m.mrncd = c.crnp



WHERE 
((c.cetcm='xcd') OR
(c.cetcm='ewfwe') OR
(c.cetcm='fewfew') OR
(c.cetcm='fewf')) AND

(m.MDATA Between 20100101 And 20110406) AND

((m.mcdmv=11) OR 
(m.mcdmv=12) OR 
(m.mcdmv=13) OR 
(m.mcdmv=14)) AND

(mm.aarm=1)


GROUP BY c.ccod, c.cetcm, c.cdscr, c.cpcul, c.cdent, mm.amexi

ORDER BY c.ccod
  

Комментарии:

1. Предоставление нам количества строк не поможет. Если вы сказали мне, что он должен возвращать 7 тысяч строк, почему меня это волнует? И что случилось с именами таблиц / полей. GROUP BY самый неправильно понятый синтаксис TSQL.

2. Вам нужно помнить, что строки, сохраненные из-за OUTER объединения, будут иметь NULL значения для столбцов в m и mm . Затем ваше WHERE предложение устраняет эти строки.

3. @Totty — Значит, если вы полностью закомментируете предложение Where, вы все равно не получите желаемых результатов? Как насчет того, чтобы комментировать раздел за разделом предложения Where? Вам нужно разбить эти проблемы на меньшие части, чтобы изолировать проблему.

4. ИТАК, как мне управлять нулевыми значениями в этом случае?

5. @Martin — Ты можешь. Затем вы просто не сможете просмотреть этот тип запроса в QBE.

Ответ №1:

Как было предложено, вам нужно переместить критерии для таблиц в левых объединениях в их соответствующие предложения ON:

 SELECT c.ccod, c.cetcm, c.cdscr, c.cpcul, c.cdent, mm.amexi
    , Sum(CASE WHEN m.mcdmv=11 THEN m.mqtd END) As Total11
    , Sum(CASE WHEN m.mcdmv=12 THEN m.mqtd END) As Total12
    , Sum(CASE WHEN m.mcdmv=13 THEN m.mqtd END) As Total13
    , Sum(CASE WHEN m.mcdmv=14 THEN m.mqtd END) As Total14
    , MAX(CASE WHEN m.mcdmv=82 THEN m.mdata END) As Max82
FROM (zzz.ccc c 
    LEFT JOIN zzz.mmmm mm 
        ON (c.crnp = mm.arncd
        And m.aarm = 1))
    LEFT JOIN zzz.mm m 
        ON (m.mrncd = c.crnp
            And m.mcdmv In(11,12,13,14,82)
            And m.MDATA Between #20100101# And #20110406#)
WHERE c.cetcm In('xcd','ewfwe','fewfew','fewf')
GROUP BY c.ccod, c.cetcm, c.cdscr, c.cpcul, c.cdent, mm.amexi
ORDER BY c.ccod
  

Кроме того, я использовал функцию IN, которая позволяет передавать ряд значений. Кстати, Access, вероятно, также будет отказываться от наличия псевдонимов столбцов для агрегатных функций столбцов. Здесь я только что использовал кое-что простое.

Комментарии:

1. спасибо, что сработало.. Теперь, похоже, у меня слишком много записей.. позвольте мне лучше проверить!

2. «As Toatal11» и другой As, похоже, не меняют имена моих столбцов в результатах … : s

3. @Totty — Access может захотеть заключить их в квадратные скобки. Например. «Как [Total11]»

4. теперь у меня проблема. Я использовал Microsoft query, а не access. Теперь я использую access, и если я использую «И» после «ВКЛ» («… И m.aarm = 1»), он просто вылетает!?

5. @Totty — Возможно, вы столкнулись с другой проблемой. Иногда можно выполнить запрос к Access (Jet), который технически должен работать, но Jet кричит «дядя» из-за несвязанной ошибки или сбоя. Это одна из «фантастических» «особенностей» Jet. Чтобы узнать, так ли это, я бы попробовал удалить второе предложение join и where (и связанные записи предложения Select), а затем один за другим добавлять элементы обратно, чтобы увидеть, где происходит сбой.