Софтуерно Инженерство
Loading...
vancho avatar vancho 430 Точки

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;

Тагове:
1
Java DB 12/10/2016 15:59:16
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Може ли да кажеш и коя задача е (т.е. да видим условието). Защото аз на пръв поглед виждам огромна разлика между двете заявки. В едната се казва "Нещо булево ИЛИ нещо булево И нещо булево" а в другата "(Нещо булево ИЛИ нещо булево) И нещо булево". Изглежда ми като да не е въпрос на догадки, а по-скоро на логическа проверка.

0
12/10/2016 16:03:29
vancho avatar vancho 430 Точки

Sample Exam Bank -> Section 3. Querying -> 3. Customer City

LINK

1
12/10/2016 16:06:43
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Ясно, да. Ами така е по условие:

" 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 букви.

0
12/10/2016 16:13:49
vancho avatar vancho 430 Точки

Ами това не е ли същото:

WHERE (c.last_name LIKE 'Bu%'
     OR c.first_name LIKE '%a')
   AND LENGTH(ci.city_name) >= 8;

1
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Да, така изглежда същото (оригинално в поста ги няма скобите). И така ли не работи?

0
vancho avatar vancho 430 Точки

Със и без скобите дава два резултата, които са едни и същи. Само не разбрах

ТОВА:

 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?

2
12/10/2016 16:22:58
vancho avatar vancho 430 Точки

Не, не работи!

1
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Има разлика дали ще ги има скобите или не - обяснението е по-горе.

Последното нещо, което си попитал обаче си прав - еднакви са нещата. Ще разгледам защо в judge дават различни резултати. Т.е. знам защо дават различни - няма ORDER BY (дори и по условие) и съответно DB Engine-а сортира двата резултсета по различен начин заради функцията LIKE и RIGHT/LEFT. Защо обаче не се вижда като се тества в HieidSQL това нямам идея. Ще допроуча нещата и ще пиша отново в темата.

За редовния изпит ще поставим ORDER BY в такива ситуации.

2
vancho avatar vancho 430 Точки

Ок, благодаря. Не ползвам Heidi, ако е от значение, а DBeaver има повече функционалности.

2
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Проверих го.

Ще въведем корекция в условието, да има ORDER BY, защото наистина това е проблемът. DB Engine-а връща произволни резултати при различните функции, когато не напишеш ORDER BY. Малко по-късно ще се коригира условието и съответно и теста (в момента тестът е невъзможен за уцелване, наистина, на първо място излиза резултат с ID=39, после ID=16 а после ID=28...)

2
vancho avatar vancho 430 Точки

yes

2