I have some SQL statements that the 3.3.2 engine does not seem to
handle properly.
The project with which this is associated is keeping track of the
game schedule for a Little League division, and being able to produce
the proper standings at the end of the season. The standings are
first based on the number of wins and ties (these are children
playing on unlighted diamonds, so ties are allowed to stand), and if
two or more teams are tied for points, then head-to-head and other
comparisons are used to assign bonus points to break the ties.
I have changed the names of the teams from the actual names and used
the actual schedule results from one 2005 summer division.
Most of the SQL statements are fine. I have added SQL style comments
to indicate the problem area. Is this a limitation/defect in SQLite,
or do I need to restructure the SQL to make it work properly? I am
puzzled because, while this is ugly SQL, it actually works with MySQL
and SQL Server.
Create Table Teams (
TeamID INT NOT NULL,
TeamName VARCHAR(32) NOT NULL,
PRIMARY KEY(TeamID)
);
INSERT INTO Teams(TeamID, TeamName) VALUES(1, 'Team1');
INSERT INTO Teams(TeamID, TeamName) VALUES(2, 'Team2');
INSERT INTO Teams(TeamID, TeamName) VALUES(3, 'Team3');
INSERT INTO Teams(TeamID, TeamName) VALUES(4, 'Team4');
INSERT INTO Teams(TeamID, TeamName) VALUES(5, 'Team5');
INSERT INTO Teams(TeamID, TeamName) VALUES(6, 'Team6');
INSERT INTO Teams(TeamID, TeamName) VALUES(7, 'Team7');
INSERT INTO Teams(TeamID, TeamName) VALUES(8, 'Team8');
INSERT INTO Teams(TeamID, TeamName) VALUES(9, 'Team9');
INSERT INTO Teams(TeamID, TeamName) VALUES(10, 'Team10');
CREATE TABLE Schedule (
GameNumber INT NOT NULL,
Visitor INT NOT NULL,
VisitorScore INT NULL,
Home INT NOT NULL,
HomeScore INT NULL,
WeekDay VARCHAR(16) NOT NULL,
GameDate DATETIME NOT NULL,
PRIMARY KEY(GameNumber)
);
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(1, 1, 6, 2, 9, 'Mon.',
'2005-07-04 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(2, 3, 6, 4, 1, 'Mon.',
'2005-07-04 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(3, 5, 23, 6, 0, 'Mon.',
'2005-07-04 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(4, 7, 4, 8, 15, 'Mon.',
'2005-07-04 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(5, 6, 0, 1, 10, 'Wed.',
'2005-07-06 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(6, 9, 6, 10, 9, 'Wed.',
'2005-07-06 20:30');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(7, 4, 2, 5, 12, 'Wed.',
'2005-07-06 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(8, 9, 5, 3, 11, 'Thurs.',
'2005-07-07 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(9, 2, 2, 7, 7, 'Thurs.',
'2005-07-07 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(10, 10, 7, 8, 1, 'Thurs.',
'2005-07-07 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(11, 7, 0, 6, 16, 'Mon.',
'2005-07-11 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(12, 5, 16, 9, 4, 'Mon.',
'2005-07-11 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(13, 10, 3, 3, 6, 'Mon.',
'2005-07-11 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(14, 8, 15, 2, 11, 'Mon.',
'2005-07-11 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(15, 1, 1, 4, 1, 'Mon.',
'2005-07-11 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(16, 4, 6, 7, 3, 'Wed.',
'2005-07-13 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(17, 10, 6, 2, 7, 'Wed.',
'2005-07-13 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(18, 3, 1, 5, 1, 'Wed.',
'2005-07-13 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(19, 9, 2, 1, 13, 'Wed.',
'2005-07-13 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(20, 6, 0, 8, 10, 'Thurs.',
'2005-07-14 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(21, 4, 1, 5, 1, 'Thurs.',
'2005-07-14 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(22, 1, 8, 10, 14, 'Thurs.',
'2005-07-14 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(23, 5, NULL, 10, NULL, 'Mon.',
'2005-07-18 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(24, 2, 5, 6, 7, 'Mon.',
'2005-07-18 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(25, 7, 11, 9, 9, 'Mon.',
'2005-07-18 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(26, 8, 1, 4, 1, 'Mon.',
'2005-07-18 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(27, 1, 11, 3, 7, 'Tues.',
'2005-07-19 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(28, 4, 8, 2, 7, 'Wed.',
'2005-07-20 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(29, 10, 13, 6, 7, 'Wed.',
'2005-07-20 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(30, 3, 9, 7, 7, 'Thurs.',
'2005-07-21 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(31, 5, 1, 1, 1, 'Thurs.',
'2005-07-21 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(32, 2, 4, 10, 7, 'Thurs.',
'2005-07-21 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(33, 9, 1, 8, 11, 'Fri.',
'2005-07-22 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(34, 6, 4, 4, 7, 'Mon.',
'2005-07-25 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(35, 7, 1, 5, 1, 'Mon.',
'2005-07-25 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(36, 2, 17, 9, 5, 'Mon.',
'2005-07-25 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(37, 8, 8, 3, 3, 'Tues.',
'2005-07-26 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(38, 9, 7, 6, 0, 'Wed.',
'2005-07-27 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(39, 1, 0, 7, 7, 'Wed.',
'2005-07-27 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(40, 4, 10, 3, 2, 'Thurs.',
'2005-07-28 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(41, 5, 1, 8, 1, 'Thurs.',
'2005-07-28 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(42, 9, 7, 7, 8, 'Mon.',
'2005-08-01 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(43, 8, 7, 1, 0, 'Mon.',
'2005-08-01 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(44, 3, 0, 2, 1, 'Mon.',
'2005-08-01 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(45, 10, 6, 4, 4, 'Mon.',
'2005-08-01 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(46, 6, 1, 5, 1, 'Mon.',
'2005-08-01 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(47, 4, 8, 9, 1, 'Wed.',
'2005-08-03 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(48, 7, 5, 10, 6, 'Wed.',
'2005-08-03 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(49, 2, 1, 5, 1, 'Wed.',
'2005-08-03 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(50, 6, 1, 3, 8, 'Thurs.',
'2005-08-04 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(51, 1, 0, 8, 7, 'Thurs.',
'2005-08-04 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(52, 8, 15, 7, 0, 'Mon.',
'2005-08-08 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(53, 3, 10, 6, 4, 'Mon.',
'2005-08-08 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(54, 5, 1, 4, 1, 'Mon.',
'2005-08-08 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(55, 2, 13, 1, 3, 'Mon.',
'2005-08-08 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(56, 10, 5, 9, 3, 'Mon.',
'2005-08-08 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(57, 7, 8, 2, 15, 'Wed.',
'2005-08-10 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(58, 6, 0, 1, 7, 'Wed.',
'2005-08-10 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(59, 3, 5, 9, 5, 'Wed.',
'2005-08-10 18:00');
INSERT INTO Schedule(GameNumber, Visitor, VisitorScore, Home,
HomeScore, WeekDay, GameDate) VALUES(60, 8, 4, 10, 2, 'Wed.',
'2005-08-10 18:00');
CREATE TABLE Standings (
TeamID INT NOT NULL,
OpponentID INT NOT NULL,
Runs INT NOT NULL,
Wins INT NOT NULL,
Loses INT NOT NULL,
Ties INT NOT NULL,
Bonus INT NOT NULL,
PRIMARY KEY(TeamID, OpponentID)
);
INSERT INTO Standings (TeamID, OpponentID, Runs, Wins, Loses, Ties,
Bonus)
SELECT A.TeamID,
A.OpponentID,
SUM(A.Runs) "Runs",
SUM(A.Wins) "Wins",
SUM(A.Loses) "Loses",
SUM(A.Ties) "Ties",
SUM(A.Bonus) "Bonus"
FROM ( SELECT Visitor "TeamID", Home "OpponentID", VisitorScore
"Runs", 1 "Wins", 0 "Loses", 0 "Ties", 0 "Bonus"
FROM Schedule
WHERE VisitorScore >= 0
AND VisitorScore > HomeScore
UNION
SELECT Home "TeamID", Visitor "OpponentID", HomeScore "Runs", 1
"Wins", 0 "Loses", 0 "Ties", 0 "Bonus"
FROM Schedule
WHERE VisitorScore >= 0
AND VisitorScore < HomeScore
UNION
SELECT Visitor "TeamID", Home "OpponentID", VisitorScore "Runs", 0
"Wins", 1 "Loses", 0 "Ties", 0 "Bonus"
FROM Schedule
WHERE VisitorScore >= 0
AND VisitorScore < HomeScore
UNION
SELECT Home "TeamID", Visitor "OpponentID", HomeScore "Runs", 0
"Wins", 1 "Loses", 0 "Ties", 0 "Bonus"
FROM Schedule
WHERE VisitorScore >= 0
AND VisitorScore > HomeScore
UNION
SELECT Visitor "TeamID", Home "OpponentID", VisitorScore "Runs", 0
"Wins", 0 "Loses", 1 "Ties", 0 "Bonus"
FROM Schedule
WHERE VisitorScore >= 0
AND VisitorScore = HomeScore
) A
GROUP BY A.TeamID, A.OpponentID
ORDER BY TeamID, OpponentID;
SELECT A.TeamID,
B.TeamName,
A.Points
FROM ( SELECT TeamID,
(SUM(Wins) * 30) + (SUM(Ties) * 20) + Sum(Bonus)
"Points"
FROM Standings
GROUP BY TeamID
) A
JOIN Teams B ON A.TeamID = B.TeamID
ORDER BY A.Points;
----> The following statement works in other databases but fails in
SQLite with "SQL error: no such column: X.TeamID"
SELECT X.TeamID,
X.TeamName,
Y.TeamID,
Y.TeamName,
X.Points
FROM ( SELECT A.TeamID,
B.TeamName,
A.Points
FROM ( SELECT TeamID,
(SUM(Wins) * 30) + (SUM(Ties) *
20) + Sum(Bonus) "Points"
FROM Standings
GROUP BY TeamID
) A
JOIN Teams B ON A.TeamID = B.TeamID
) X
JOIN ( SELECT C.TeamID,
D.TeamName,
C.Points
FROM ( SELECT TeamID,
(SUM(Wins) * 30) + (SUM(Ties) *
20) + Sum(Bonus) "Points"
FROM Standings
GROUP BY TeamID
) C
JOIN Teams D ON C.TeamID = D.TeamID
) Y ON X.Points = Y.Points
WHERE X.TeamID <> Y.TeamID
ORDER BY X.TeamName;
----> No surprise, since this uses a similar structure, it also
fails, but only in SQLite.
SELECT A.TeamID,
B.Team1Name "Team Name",
A.OpponentID,
B.Team2Name "Opponent Name",
A.Runs,
A.Wins,
A.Loses,
A.Ties,
A.Bonus
FROM Standings A
JOIN ( SELECT X.TeamID "Team1", X.TeamName "Team1Name", Y.TeamID
"Team2", Y.TeamName "Team2Name"
FROM ( SELECT A.TeamID,
B.TeamName,
A.Points
FROM ( SELECT TeamID,
(SUM(Wins) * 30) + (SUM(Ties)
* 20) + Sum(Bonus) "Points"
FROM Standings
GROUP BY TeamID
) A
JOIN Teams B ON A.TeamID = B.TeamID
) X
JOIN ( SELECT A.TeamID,
B.TeamName,
A.Points
FROM ( SELECT TeamID,
(SUM(Wins) * 30) + (SUM(Ties)
* 20) + Sum(Bonus) "Points"
FROM Standings
GROUP BY TeamID
) A
JOIN Teams B ON A.TeamID = B.TeamID
) Y ON X.Points = Y.Points
WHERE X.TeamID <> Y.TeamID
) B ON A.TeamID = B.Team1
AND A.OpponentID = B.Team2
ORDER BY A.TeamID;