Другой способ выполнения этого - использование временной таблицы для хранения различных значений. Сначала вставьте точные совпадения, затем вставьте точные совпадения, которые не найдены в первоначальном выборе и, наконец, возьмите все результаты из таблицы temp. Это решение больше кода, чем другое, поэтому просто добавьте его в качестве альтернативы.
Пример (SqlFiddle):
Схема первого
create table students
(code integer,
name varchar(50),
topic varchar(50),
value integer);
create table subjects
(subject varchar(50),
value varchar(50),
result integer);
insert students
(code, name, topic, value)
values
(1, 'Doe, John', 'History', 25),
(2, 'Doe, John', 'Geography', 30),
(3, 'Doe, Jane', 'Mathematics', 45),
(4, 'Doe, Jane', 'Brad Pitt Studies', 100);
insert subjects
(subject, value, result)
values
('History', 25, 95),
('History', 30, 84),
('History', 35, 75),
('Geography', 35, 51),
('Geography', 40, 84),
('Geography', 45, 65),
('Mathematics', 45, 32),
('Mathematics', 50, 38),
('Mathematics', 55, 15),
('Brad Pitt Studies', 100, 92),
('Brad Pitt Studies', 90, 90);
Фактический запрос SQL:
-- Temp table to hold our results
create temporary table tempresult
(code integer,
name varchar(50),
topic varchar(50),
studentvalue integer,
subjectvalue integer,
result integer);
-- Get the exact results
insert tempresult
(code,
name,
topic,
studentvalue,
subjectvalue,
result)
select stu.code,
stu.name,
stu.topic,
stu.value as 'student_value',
sub.value as 'subject_value',
sub.result
from students stu
join
subjects sub on sub.subject = stu.topic
and sub.value = stu.value;
-- Get the non-exact results, excluding the 'students' that we already
-- got in the first insert
insert tempresult
(code,
name,
topic,
studentvalue,
subjectvalue,
result)
select stu.code,
stu.name,
stu.topic,
stu.value as 'student_value',
sub.value as 'subject_value',
sub.result
from students stu
join
subjects sub on sub.subject = stu.topic
-- Business logic here: Take lowest subject value that is just above the student's value
and sub.value = (select min(sub2.value)
from subjects sub2
where sub2.subject = stu.topic
and sub2.value > stu.value)
where not exists (select 1
from tempresult tmp
where tmp.code = stu.code
and tmp.name = stu.name
and tmp.topic = stu.topic)
-- Get our resultset
select code,
name,
topic,
studentvalue,
subjectvalue,
result
from tempresult
order by code,
name,
topic,
studentvalue,
subjectvalue,
result
Существует не точное совпадение 'Mathematics', но в этом случае значение в' table1' не ниже, чем все значения в 'table2' ... что вы хотите сделать? –
@DavidFaber Я испортил свой первый стол - они должны совпадать. Я отредактирую сообщение, извините за путаницу. –
Есть темы, похожие на темы? – Strawberry