You've given me a lot to chew on. I'll report back.
I agree with the 'nothing untoward' assessment.
Here's a quick example (ANSI-92 Query Mode SQL DDL syntax):
CREATE TABLE Grades (
grade_description VARCHAR(12) NOT NULL,
age_limit_lower INTEGER NOT NULL,
age_limit_upper INTEGER NOT NULL,
grade_limit_lower DECIMAL(5, 2) NOT NULL,
grade_limit_upper DECIMAL(5, 2) NOT NULL
)
;
CREATE TABLE People (
person_name VARCHAR(35) NOT NULL,
age INTEGER NOT NULL
)
;
CREATE TABLE Scores (
person_name VARCHAR(35) NOT NULL,
score DECIMAL(5, 2) NOT NULL
)
;
INSERT INTO Grades (grade_description, age_limit_lower,
age_limit_upper, grade_limit_lower, grade_limit_upper) VALUES ('Pass',
6, 13, 0.00, 39.99)
;
INSERT INTO Grades (grade_description, age_limit_lower,
age_limit_upper, grade_limit_lower, grade_limit_upper) VALUES
('Distinction', 6, 13, 40.00, 100.00)
;
INSERT INTO Grades (grade_description, age_limit_lower,
age_limit_upper, grade_limit_lower, grade_limit_upper) VALUES ('Fail',
14, 999, 0.00, 39.99)
;
INSERT INTO Grades (grade_description, age_limit_lower,
age_limit_upper, grade_limit_lower, grade_limit_upper) VALUES ('Pass',
14, 999, 40.00, 64.99)
;
INSERT INTO Grades (grade_description, age_limit_lower,
age_limit_upper, grade_limit_lower, grade_limit_upper) VALUES ('Gold',
14, 999, 65.00, 74.99)
;
INSERT INTO Grades (grade_description, age_limit_lower,
age_limit_upper, grade_limit_lower, grade_limit_upper) VALUES
('Platinum', 14, 999, 75.00, 100.99)
;
INSERT INTO People (person_name, age) VALUES ('ChildOne', 8)
;
INSERT INTO People (person_name, age) VALUES ('ChildTwo', 13)
;
INSERT INTO People (person_name, age) VALUES ('AdultOne', 22)
;
INSERT INTO People (person_name, age) VALUES ('AdultTwo', 55)
;
INSERT INTO Scores (person_name, score) VALUES ('ChildOne', 23.45)
;
INSERT INTO Scores (person_name, score) VALUES ('ChildTwo', 67.89)
;
INSERT INTO Scores (person_name, score) VALUES ('AdultOne', 34.56)
;
INSERT INTO Scores (person_name, score) VALUES ('AdultTwo', 78.90)
;
SELECT P1.person_name, S1.score, G1.grade_description
FROM (Scores AS S1
INNER JOIN People AS P1
ON P1.person_name = S1.person_name), Grades AS G1
WHERE S1.score BETWEEN G1.grade_limit_lower AND G1.grade_limit_upper
AND P1.age BETWEEN G1.age_limit_lower AND G1.age_limit_upper
;
And here it is as VBA to create a new mdb, tables and data:
Sub LookupMultiCriteria()
' Kill Environ$("temp") & "\DropMe.mdb"
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
..Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & _
Environ$("temp") & "\DropMe.mdb"
With .ActiveConnection
Dim sql As String
sql = _
"CREATE TABLE Grades (" & vbCr & "grade_description" & _
" VARCHAR(12) NOT NULL, " & vbCr & "age_limit_lower" & _
" INTEGER NOT NULL, " & vbCr & "age_limit_upper" & _
" INTEGER NOT NULL, " & vbCr & "grade_limit_lower" & _
" DECIMAL(5, 2) NOT NULL, " & vbCr & "grade_limit_upper" & _
" DECIMAL(5, 2) NOT NULL" & vbCr & ")"
..Execute sql
sql = _
"CREATE TABLE People (" & vbCr & "person_name" & _
" VARCHAR(35) NOT NULL, " & vbCr & "age INTEGER" & _
" NOT NULL" & vbCr & ")"
..Execute sql
sql = _
"CREATE TABLE Scores (" & vbCr & "person_name" & _
" VARCHAR(35) NOT NULL, " & vbCr & "score" & _
" DECIMAL(5, 2) NOT NULL" & vbCr & ")"
..Execute sql
sql = _
"INSERT INTO Grades (grade_description," & _
" age_limit_lower, age_limit_upper," & _
" grade_limit_lower, grade_limit_upper)" & _
" VALUES ('Pass', 6, 13, 0.00," & _
" 39.99)"
..Execute sql
sql = _
"INSERT INTO Grades (grade_description," & _
" age_limit_lower, age_limit_upper," & _
" grade_limit_lower, grade_limit_upper)" & _
" VALUES ('Distinction', 6, 13," & _
" 40.00, 100.00)"
..Execute sql
sql = _
"INSERT INTO Grades (grade_description," & _
" age_limit_lower, age_limit_upper," & _
" grade_limit_lower, grade_limit_upper)" & _
" VALUES ('Fail', 14, 999, 0.00," & _
" 39.99)"
..Execute sql
sql = _
"INSERT INTO Grades (grade_description," & _
" age_limit_lower, age_limit_upper," & _
" grade_limit_lower, grade_limit_upper)" & _
" VALUES ('Pass', 14, 999, 40.00," & _
" 64.99)"
..Execute sql
sql = _
"INSERT INTO Grades (grade_description," & _
" age_limit_lower, age_limit_upper," & _
" grade_limit_lower, grade_limit_upper)" & _
" VALUES ('Gold', 14, 999, 65.00," & _
" 74.99)"
..Execute sql
sql = _
"INSERT INTO Grades (grade_description," & _
" age_limit_lower, age_limit_upper," & _
" grade_limit_lower, grade_limit_upper)" & _
" VALUES ('Platinum', 14, 999," & _
" 75.00, 100.99)"
..Execute sql
sql = _
"INSERT INTO People (person_name," & _
" age) VALUES ('ChildOne', 8)"
..Execute sql
sql = _
"INSERT INTO People (person_name," & _
" age) VALUES ('ChildTwo', 13)"
..Execute sql
sql = _
"INSERT INTO People (person_name," & _
" age) VALUES ('AdultOne', 22)"
..Execute sql
sql = _
"INSERT INTO People (person_name," & _
" age) VALUES ('AdultTwo', 55)"
..Execute sql
sql = _
"INSERT INTO Scores (person_name," & _
" score) VALUES ('ChildOne', 23.45)"
..Execute sql
sql = _
"INSERT INTO Scores (person_name," & _
" score) VALUES ('ChildTwo', 67.89)"
..Execute sql
sql = _
"INSERT INTO Scores (person_name," & _
" score) VALUES ('AdultOne', 34.56)"
..Execute sql
sql = _
"INSERT INTO Scores (person_name," & _
" score) VALUES ('AdultTwo', 78.90)"
..Execute sql
sql = _
"CREATE VIEW PersonGrades AS" & _
" SELECT P1.person_name, S1.score," & _
" G1.grade_description " & vbCr & "FROM (Scores" & _
" AS S1 " & vbCr & "INNER JOIN People AS P1" & _
" " & vbCr & "ON P1.person_name = S1.person_name)," & _
" Grades AS G1 " & vbCr & "WHERE S1.score" & _
" BETWEEN G1.grade_limit_lower" & _
" AND G1.grade_limit_upper" & vbCr & "AND" & _
" P1.age BETWEEN G1.age_limit_lower" & _
" AND G1.age_limit_upper"
..Execute sql
sql = _
"SELECT V1.person_name, V1.score," & _
" V1.grade_description " & vbCr & "FROM PersonGrades" & _
" AS V1"
Dim rs
Set rs = .Execute(sql)
MsgBox rs.GetString
End With
Set .ActiveConnection = Nothing
End With
End Sub
Jamie.
--