Оператор выбора SQL: как получить все значения из таблицы 'M' и любые коррелирующие значения из таблицы 'T' или 0, если ничего - PullRequest
2 голосов
/ 27 октября 2010

Я пытаюсь создать запрос в коммерческой системе ERP, которая использует Access в качестве своей базы данных, E2 Shop System. Так что он просто выполняет запрос через Access.

Я хочу, чтобы в запросе говорилось, "сколько времени было зарегистрировано на каждой машине в день запроса, даже если оно равно 0" Я выяснил, как заставить его выводить, сколько времени находится на машине, но только для машины, на которой есть время.

Вот упрощенный пример:

Таблица: M (машина)

Name  |   ID
------------
Saw   |   1
Drill |   2
Weld  |   3
Lathe |   4
Paint |   5

Таблица: T (время)

Hours   |  Date  |  Name
-------------------------
8       | 10-25  |  Weld
6       | 10-25  |  Saw
10      | 10-25  |  Lathe
2       | 10-01  |  Drill

Вывод, который я хочу получить из запроса при запросе даты 10-25, должен получить:

Saw   |  6
Drill |  0
Weld  |  8
Lathe |  10
Paint |  0

Все, что я могу понять, это то, что оно ограничивает вывод только машинами, которые имеют время против них

SELECT M.name, T.time
FROM M, T
WHERE T.Date = [ENTER DATE POSTED (MM/DD/YY):]))
ORDER BY M.ID ;

Я думаю, что CASE может помочь, но я не могу заставить его работать.

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Оператор WHERE исключает записи, в которых дата является нулевой, что имеет место для таблицы времени, поэтому вам необходимо добавить Or Is Null.Это может усложниться, в зависимости от записей, которые вы хотите вернуть, вам может понадобиться подзапрос.

SELECT M.Name, Nz([Hours],0) AS Hrs
FROM Machine AS M 
LEFT JOIN [Time] AS T 
ON M.Name = T.Name
WHERE T.Date=#10/25/2010# Or T.Date Is Null
ORDER BY M.ID;

Надеюсь, у вас нет полей с именем name и таблиц с именем time, поскольку они зарезервированыслова.

РЕДАКТИРОВАТЬ комментарий

SELECT m.Name, IIf(IsNull(ts.Hours),0,ts.Hours) AS Hrs
FROM Machine AS m 
LEFT JOIN (
     SELECT t.Name,t.Date,t.Hours 
     FROM [Time] AS T 
     WHERE T.Date=#10/25/2010#) AS ts 
ON m.Name = ts.Name;
1 голос
/ 27 октября 2010

Используйте левое соединение:

SELECT M.Name, COALESCE(T.time, 0)
FROM M
LEFT JOIN T
ON M.Name = T.Name AND T.Date = ...
ORDER BY M.Id

Я не думаю, что в Access есть COALESCE, хотя ... вы можете использовать Nz вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...