2016-06-14 2 views
0

Я стараюсь управлять командой доставки. Вот почему я хочу отобразить таблицу. Первая строка будет завершена днем. И следующие строки будут заполнены состояниями и их продолжительностью. Строка «дата» должна содержать все дни месяца. Даже если никто не работает.Слева Join/OR - [SQL ACCESS]

- First table (typeState) - 
deliveryStatusDuration //State Time (seconds) INTEGER 
deliveryStatus //Type Status     INTEGER 
startStatus //Start of the state    DATE 
endStatus //End of the state     DATE 
deliveryCarNum //deliverer identifier   INTEGER 


- Second table (dateTable) - 
dateInt // Just an integer (from 1 to 31)  INTEGER 

My SQL запрос:

SELECT SUM(deliveryStatusDuration) AS DURATION, deliveryStatus, datetable.dateInt 
FROM datetable      
LEFT JOIN typeState ON datetable.dateInt = DAY(typeState.startStatus) 
WHERE deliveryCarNum=:CarNum  
AND startStatus >= :DateStart 
AND endStatus <= :DateEnd   
AND (typeState.startStatus Is Null) 
OR (typeState.deliveryStatus Is Null) 
OR datetable.dateInt <= DAY(:DateEnd)  
GROUP BY datetable.dateInt, deliveryStatus 

Проблема заключается в том, что независимо от месяца используется, отображается вся информация. Я думаю, что «ИЛИ» уничтожает мой «И», поэтому у меня нет тех дней, когда начинается состояние. Например, если человек доставки начинает сдавать 4 мая 2016 года и заканчивается 8 мая 2016 года; моя просьба не указана 4 августа. 1 2 3 5 6 7 8 9 10 ... 31

+0

Закрепите круглые скобки, чтобы реализовать логику, которую вы действительно хотите. –

+0

Также, если вы хотите, чтобы все целые числа даты были включены, переместите условия typestate из предложения where в оператор join. Помещение их в предложение where ограничит ваш весь результат, поставленный ими, тогда как помещение их в качестве условий соединения ограничит то, что позволяет сопоставлять и быть включенным из типичной таблицы – Matt

ответ

1

Я предполагаю, что положение WHERE вы хотите:

WHERE deliveryCarNum = :CarNum AND 
     startStatus >= :DateStart AND 
     endStatus <= :DateEnd AND 
     (typeState.startStatus Is Null OR 
     typeState.deliveryStatus Is Null OR 
     datetable.dateInt <= DAY(:DateEnd) 
    ) 
1

Как следует из комментария Гордона. Вы хотите объединить свои OR вместе.

AND (THIS OR THAT OR THEOTHER) 

, а не

AND (THIS) 
OR (THAT) 
OR (THEOTHER) 
1

Это работа! :

SELECT SUM(deliveryStatusDuration) AS DURATION, deliveryStatus, datetable.dateInt 
FROM datetable      
LEFT JOIN typeState ON datetable.dateInt = DAY(typeState.startStatus) 
WHERE deliveryCarNum = :CarNum AND 
    startStatus >= :DateStart AND 
    endStatus <= :DateEnd AND 
    (
    typeState.startStatus Is Null OR 
    typeState.deliveryStatus Is Null OR 
    datetable.dateInt <= DAY(:DateEnd) 
) 
GROUP BY datetable.dateInt, deliveryStatus 

Этот запрос выбирает правильные линии (независимо от даты). Но я не вижу каждый день ..

LEFT JOIN typeState ON datetable.dateInt = DAY(typeState.startStatus) OR ((DAY(typeState.startStatus) Is Null)) 
Смежные вопросы