2015-06-11 2 views
1

Обучение, будь добр.SQL Как преобразовать это в SubQuery?

Я пытаюсь понять, как это работает, и я сделал несколько успешных преобразований, но этот я сфокусирован.

Как взять этот код и преобразовать его в подзапрос? Я немного потерял.

SELECT o.FirstName + ' ' + o.LastName AS Driver, COUNT(DISTINCT s.vehicleID) NoOfBusesUsed 
FROM Operators AS o, Runs AS r, Schedules AS s JOIN Trips AS t 
ON s.scheduleID = t.scheduleID 
WHERE r.BidDate BETWEEN '09/01/2004' AND '09/30/2004' 
GROUP BY o.FirstName + ' ' + o.LastName 
HAVING COUNT(s.vehicleID) > 1 

Вот как мои таблицы настроены. Если вам нужна дополнительная информация, я могу опубликовать ее.

CREATE TABLE Operators 
    (
    SeniorityNumber  char(4)  NOT NULL 
      CONSTRAINT ck_Operators_Seniority 
      CHECK (SeniorityNumber LIKE '[0-9][0-9][0-9][0-9]'), 
    FirstName    varchar(25) NOT NULL, 
    LastName    varchar(35) NOT NULL, 
    HireDate     smalldatetime 
      CONSTRAINT ck_Operators_HireDate CHECK (HireDate <=Getdate()) 
    ) 

CREATE TABLE Trips 
    (
    RouteNumber   varchar(4)  NOT NULL, 
    StartLocation   varchar(50) NOT NULL, 
    StartTime    time    NOT NULL, 
    EndLocation   varchar(50) NOT NULL, 
    EndTime     time    NOT NULL, 
    EffectiveDate   smalldatetime NOT NULL 
     CHECK (EffectiveDate >= cast('1/1/2000' as smalldatetime)), 
    CONSTRAINT ck_Trips_StartEnd CHECK (EndTime > StartTime) 
    ) 

CREATE TABLE Vehicles 
    (
    Manufacturer   varchar(50) 
     DEFAULT 'Gillig', 
    Model     varchar(50), 
    ModelYear    int 
     DEFAULT DatePart(yyyy,GetDate()) 
     CHECK (ModelYear <= DatePart(yyyy,GetDate())), 

    PurchaseDate   smalldatetime 
    ) 

    GO 
    ALTER TABLE operators 
     ADD OperatorID int IDENTITY --Primary Key 

    GO 
    ALTER TABLE Operators 
     ADD CONSTRAINT pkOperators Primary key (OperatorID) 

    ALTER TABLE Vehicles 
     ADD VehicleID int IDENTITY Primary Key 

    ALTER TABLE Trips 
     ADD TripID  int IDENTITY Primary key 
    GO 

CREATE TABLE Runs 
(
    RunID   int  IDENTITY  NOT NULL  Primary Key, 
    OperatorID int  NOT NULL  REFERENCES Operators, 
    BidDate  date NOT NULL   
     CONSTRAINT ckRunBidDate CHECK 
     (biddate <= dateadd(mm,6,getdate())) --getdate() + 180 
) 
GO 

CREATE TABLE Schedules 
(
    ScheduleID int  IDENTITY  Primary Key, 
    RunID   int  NOT NULL, 
    VehicleID  int  NOT NULL, 
    CONSTRAINT fk_Schedules_Runs FOREIGN KEY (RunID) 
     REFERENCES Runs(RunID), 
    CONSTRAINT fk_Schedules_Vehicles FOREIGN KEY (VehicleID) 
     REFERENCES Vehicles 
) 

ALTER TABLE Trips 
    ADD ScheduleID int NULL REFERENCES Schedules 

ответ

1

Если вы хотите использовать запрос в качестве подзапроса вы можете использовать WITH заявление или производной таблицы, как:

  • With:

    ;WITH subQuery AS (
        /* Your query here */ 
    ) 
    SELECT * 
    FROM subQuery 
    
  • Производная таблица

    SELECT * 
    FROM (
        /* your query here */ 
        ) As subQuery 
    

Я думаю, вы должны использовать запрос, как это:

SELECT 
    o.FirstName + ' ' + o.LastName AS Driver, 
    DT.cnt AS NoOfBusesUsed 
FROM 
    Operators AS o 
JOIN 
    (SELECT 
     r.OperatorID, 
     COUNT(DISTINCT s.VehicleID) AS cnt 
    FROM 
     Schedules s 
    JOIN 
     Runs r ON s.RunID = r.RunID 
    ) AS DT 
    ON DT.OperatorID = o.OperatorID 
WHERE 
    ISNULL(DT.cnt, 0) > 1 
+0

Хороший ответ! Краткая, но с хорошей детализацией. – amcdermott