JAVA DB Fundametals: SAMPLE EXAM 11.10.2016 - Problems
Защо в judge не минава горната заявка, при която изхода е един и същ с долната заявка, която е на лектора. А трябва да гъдаем по какъв начин иска judge-a да му я подадеш! П.с. това не е единичен случай от SAMPLE EXAM-а.
SELECT c.customer_id,
c.first_name,
c.last_name,
c.gender,
ci.city_name
FROM customers AS c
INNER JOIN cities AS ci
ON c.city_id = ci.city_id
WHERE (c.last_name LIKE 'Bu%'
OR c.first_name LIKE '%a')
AND LENGTH(ci.city_name) >= 8;
SELECT c.customer_id,
c.first_name,
c.last_name,
c.gender,
ci.city_name
FROM customers AS c
INNER JOIN cities AS ci
ON c.city_id = ci.city_id
WHERE (LEFT(c.last_name, 2) = 'Bu'
OR RIGHT(c.first_name, 1) = 'a')
AND LENGTH(ci.city_name) > 7;
Sample Exam Bank -> Section 3. Querying -> 3. Customer City
LINK:
Ясно, да. Ами така е по условие:
" all customers whose last name starts with ‘Bu’ or first name ends with ‘a’ ":
- Т.е. клиентите трябва да отговарят на едно от двете условия. Когато някой клиент отговаря на едно от двете условия, чак тогава трябва да отговаря И на трето:
" for those customers the length of the city name should at least 8 letters "
Т.е. логиката е
(започва с 'Bu' или завършва на 'a') И /ако първото в скобите е дало true/ градът му е с поне 8 букви
Ако ти няма скобите, лявата асоциативност ще даде:
започва с 'Bu' ИЛИ завършва на 'a' И градът му е с поне 8 букви
Съответно ако някой започва с 'Bu' без значение дали дясната част е невярна, то Вярно ИЛИ Невярно ще даде Вярно ;) Та query-то без скобите дава един допълнителен резултат - "Annie Burns от град Bromma" - както може да се видим, градът не е с 8 букви.
Ами това не е ли същото:
WHERE (c.last_name LIKE 'Bu%'
OR c.first_name LIKE '%a')
AND LENGTH(ci.city_name) >= 8;
Да, така изглежда същото (оригинално в поста ги няма скобите). И така ли не работи?
Със и без скобите дава два резултата, които са едни и същи. Само не разбрах
ТОВА:
WHERE (c.last_name LIKE 'Bu%'
OR c.first_name LIKE '%a')
AND LENGTH(ci.city_name) >= 8;
И ТОВА:
WHERE (LEFT(c.last_name, 2) = 'Bu'
OR RIGHT(c.first_name, 1) = 'a')
AND LENGTH(ci.city_name) > 7;
НЕ Е ЛИ ЕДНО И СЪЩО? Т.е. LIKE не е като LEFT или RIGHT?
Не, не работи!
Има разлика дали ще ги има скобите или не - обяснението е по-горе.
Последното нещо, което си попитал обаче си прав - еднакви са нещата. Ще разгледам защо в judge дават различни резултати. Т.е. знам защо дават различни - няма ORDER BY (дори и по условие) и съответно DB Engine-а сортира двата резултсета по различен начин заради функцията LIKE и RIGHT/LEFT. Защо обаче не се вижда като се тества в HieidSQL това нямам идея. Ще допроуча нещата и ще пиша отново в темата.
За редовния изпит ще поставим ORDER BY в такива ситуации.
Ок, благодаря. Не ползвам Heidi, ако е от значение, а DBeaver има повече функционалности.
Проверих го.
Ще въведем корекция в условието, да има ORDER BY, защото наистина това е проблемът. DB Engine-а връща произволни резултати при различните функции, когато не напишеш ORDER BY. Малко по-късно ще се коригира условието и съответно и теста (в момента тестът е невъзможен за уцелване, наистина, на първо място излиза резултат с ID=39, после ID=16 а после ID=28...)