这是我在本网站发布问题的第一次经历:)所以,我遇到了麻烦。我有一个访问数据库,我用ODBC连接。
数据库有3个表:
nombres : (-idnombre, -nombre)
rutas : (-idruta, ruta)
fechas : (-idfecha, idruta, idnombre, fecha)
示例数据:
nombres:(1,nombreA),(2,nombreB)
Rutas:(1,rutaA),(2,RutaB)
fechas:(1,1,1,28/06/2013), (2,2,1,28/06/2013), (3,2,2,28/06/2013),(4,2,2,28/06/2013)
所以我需要这个输出(第三个字段是一个计数):
rutaA - nombreA - 1 time
rutaA - nombreB - 0 times
rutaB - nombreA - 1 time
rutaB - nombreB - 2 times
我的sql是:
SELECT rutas.ruta, nombres.nombre, Count(fechas.idruta) AS CuentaDeidruta
FROM rutas INNER JOIN
(nombres INNER JOIN fechas ON nombres.idnombre = fechas.idnombre)
ON rutas.idruta = fechas.idruta
GROUP BY rutas.ruta, nombres.nombre;
没关系,但没有显示零计数。所以我的输出是:
rutaA - nombreA - 1 time
rutaB - nombreA - 1 time
rutaB - nombreB - 2 times
我尝试使用左连接,所以我遇到了一些错误。
答案 0 :(得分:1)
我认为你正在寻找Rutas和Nombres的Cartesian Product
,因此在你的样本数据中给你这样的东西,rutaA和nombreB之间没有相关性。
SELECT t.ruta, t.nombre, Count(fechas.idruta) AS CuentaDeidruta
FROM (
SELECT rutas.idruta, rutas.ruta, nombres.idnombre, nombres.nombre
FROM rutas, nombres
) t
LEFT JOIN fechas ON
t.idnombre = fechas.idnombre AND fechas.idruta = t.idruta
GROUP BY t.ruta, t.nombre;
这适用于SQL Server,但应该非常接近MS Access。另请注意LEFT JOIN
的使用情况,以确保您获得缺少的0。