2014-09-10 3 views
0

Может кто-нибудь помочь мне с запросами, которые я написал, и они не сработали правильно, возможно, кроме первого.Запрос SQL 4 tables

У нас есть 4 таблицы с - столбцами:

table_cars - id | brand | type | license 
table_equipments - id | name | description 
table_distances - id_car | date | distance 
table_cars_equipments - id_car | id_equipment 

И вопросы:

  1. Показать все автомобили, которые имеют оборудование «огнетушитель» и ехали вчера
  2. Показать все бренды без оборудования
  3. Показать общее расстояние, пройденное автомобилем «xxxx» за последний месяц
  4. Показать среднее расстояние за день ведомой автомобилями из «некоторого описания»

Мое решение:

SELECT 
    table_cars.id, 
    table_cars.brand, 
from table_equipments 
INNER JOIN table_cars_equipments ON table_equipments.id  = table_car_equipments.id_equipment 
INNER JOIN table_cars ON table_cars .id  = table_cars_equipments.id_car 
INNER JOIN table_distances ON table_distances.id_car = table_cars.id 
WHERE table_equpments.name = 'fire extinguisher' 
    AND table_date.date = NOW() - INTERVAL 1 DAYS; 

SELECT 
table_cars.brand 
from table_cars 
INNER JOIN table_cars_equipments ON table_cars_equipments.id_car = table_cars .id 
WHERE table__car_equpments.id_equipment = 0 OR NULL 

SELECT table_cars.license, 
sum(distance) as distance, 
from table_distances 
inner join table_cars on table_distances. Id_car = table_cars.id 
where table_distances.date >= NOW() - INTERVAL 30 DAYS 
and table.distances.date <= NOW() 

SELECT Avg(distance) as avg_dist 
from( 
SELECT table_distances.distance, 
Count(*) as dist 
from table_distances 
INNER JOIN table_cars_equipment ON table_dustances.id_car = table_cars_equipments.id_car 
INNER JOIN table_equipments ON table_cars_equipments.id_equipments = table_equimpents.id 
WHERE table_equipments.distance = "Ilfov" 
GROUPBY table_distances.date) a; 

ответ

1

1.Show все автомобили, которые имеют оборудование «огнетушитель» и ехали вчера

SELECT C.* FROM 
TABLE_CARS C 
INNER JOIN TABLE_DISTANCES D ON C.ID = D.ID_CAR 
INNER JOIN TABLE_CARS_EQUIPMENTS CE ON C.ID = CE.ID_CAR 
INNER JOIN TABLE_EQUIPMENTS E ON CE.ID_EQUIPMENT = E.ID 
WHERE E.DESCRIPTION = 'FIRE EXTINGUISHER' 
    AND TRUNC(D.DATE) = TRUNC(SYSDATE - 1); 

2.Show все бренды, не имеющие оборудования

SELECT DISTINCT BRAND 
FROM TABLE_CARS C 
WHERE NOT EXISTS 
(
    SELECT 'X' FROM TABLE_CARS_EQUIPMENTS CE 
    WHERE CE.ID_CAR = C.ID 
); 

3.Show общего расстояния движимого автомобиля «хххй» в прошлом месяце

SELECT SUM(DISTANCE) 
FROM TOTAL_DISTANCES D 
INNER JOIN TABLE_CARS C ON D.ID_CAR = C.ID AND C.BRAND = 'XXX' 
WHERE TO_CHAR(D.DATE,'MON') = TO_CHAR(TRUNC(SYSDATE,'MON')-1 , 'MON') 

4.Show среднего расстояния за день ведомого автомобилями из «некоторого описания»

SELECT TRUNC(D.DATE) AS DAY ,AVG(DISTANCE) 
FROM TABLE_CARS C 
INNER JOIN TABLE_DISTANCES D ON C.ID= D.ID_CAR 
WHERE C.BRAND='SOME CAR' 
GROUP BY TRUNC(D.DATE); 

Функция дата Здесь находится специфичный для Oracle!