Я декілька днів намагаюся створитизапит для згаданої бази даних Entity-Attribute-Value, і я трохи заржавів з sql, тому навіть після багатьох досліджень я не зможу отримати запит робити саме так, як я хочу.
Важливі частини таблиці виглядають так:
Ідентифікатор | концепція | модифікатор 1 | абс: 10 | @ 2 | абс: 22 | @ 2 | абс: 22 | t: f 2 | абс: 78 | @ 2 | абс: 78 | t: x 3 | kfg: 12 | @ 4 | aqx: 23 | @ 5 | абс: 49 | @ 5 | абс: 49 | t: f 5 | абс: 49 | т: г
Я хочу такий стіл:
Ідентифікатор | концепція | mod_f | mod_other 1 | абс: 10 | нульовий | нуль 2 | абс: 22 | t: f | нуль 2 | абс: 78 | нульовий | t: x 5 | абс: 49 | t: f | т: г
Мої спроби змусили мене вже до цього результату:
Ідентифікатор | концепція | mod_f | mod_other 1 | abc:10 | нульовий | нуль 2 | абс: 22 | t: f | нуль 2 | абс: 22 | нульовий | нуль 2 | абс: 78 | нульовий | t: x 2 | абс: 78 | нульовий | нуль 5 | абс: 49 | t: f | нуль 5 | абс: 49 | t: f | т: г 5 | абс: 49 | нульовий | т: г 5 | абс: 49 | нульовий | нуль
Ось код, який дав мій результат:
ВИБІРТЕ t.ID, t.concept, t.modifier, випадок, коли т.концепція LIKE "abc:%" і t.modifier = "@", тоді t.concept закінчується AS "концепція", випадок, коли t2.modifier = "t: f", тоді t2.modifier закінчується AS "mod_f", випадок, коли t3.modifier LIKE "t:%", тоді t3.modifier закінчується AS "mod_other" З таблиці, як t Ліва приєднайтесь до таблиці як t2 ON t.ID = t2.ID і t.concept = t2.concept Ліва приєднайтесь до таблиці як t3 ON t2.ID = t3.ID і t2.concept = t3.concept ДЕ t.concept LIKE "abc:%" і t.modifier = "@" і (t2.modifier LIKE "t: f" або t2.modifier = "@") і (t3.modifier = "t: g" або t3.modifier = "t: x" або t3.modifier = "@")
ЗАМОВЛЕННЯ по t.ID asc;
Виправлення виглядає легко, але все, що я маюСпробував зменшити результати внизу, ніж те, що я хочу (в основному видаляє занадто багато рядків), і на даний момент я більше не знаю, що мені потрібно шукати.
Також частина "регістру" у запиті виглядає якбрудне рішення, яке я десь знайшов і використовував, оскільки він працює (робить "@" в "null"), тому якщо у вас є якісь пропозиції зробити запит більш чистим, сміливо відповідайте.
Відповіді:
0 для відповіді № 1Гаразд, я знайшов відповідь, і це було легше, ніж я думав.
GROUP by - це відповідь. Я думав, що це не допоможе працювати над текстом, але ви можете насправді об'єднати заяви з вибору регістру тексту макс подобається це:
ВИБРАТИ t.ID, t.concept, t.модифікатор, max (випадок, коли t.concept LIKE "abc:%" і t.modifier = "@", тоді t.concept закінчується) AS "концепція", max (випадок, коли t2.modifier = "t: f", тоді t2.modifier кінець) AS "mod_f", max (випадок, коли t3.modifier LIKE "t:%", тоді t3.modifier end) AS "mod_other" З таблиці, як t Ліва приєднайтесь до таблиці як t2 ON t.ID = t2.ID і t.concept = t2.concept Ліва приєднайтесь до таблиці як t3 ON t2.ID = t3.ID і t2.concept = t3.concept ДЕ t.concept LIKE "abc:%" і t.modifier = "@" і (t2.modifier LIKE "t: f" або t2.modifier = "@") і (t3.modifier = "t: g" або t3.modifier = "t: x" або t3.modifier = "@") ГРУПА за t.ID, t.concept, t.modifier ЗАМОВИТИ по t.ID asc;
Це отримує мені саме стіл, який я шукав. Але це працює лише тому, що mod_other може містити лише 1 код на концепцію.