Вкладені запити, які повертають декілька стовпців
До цих пір розглядалися вкладені запити, які повертають єдиний стовпець,проте в СУБД MySQL реалізовані так звані рядкові запити, які повертаютьбільше одного стовпця. Приклади таких запитів представлені в прикладі
Приклад
SELECT * FROM tbll WHERE (1,2) = (SELECT coll, col2 FROM tbl2);
SELECT * FROM tbll WHERE ROW(l,2) = (SELECT coll, col2 FROM tbl2);
Запит повертає рядок, якщо в таблиці tbl2 присутній запис, для якогосправедлива рівність coll = 1 і со12 = 2.
Вирази "(1,2)" і "row (1,2)" називаються конструкторами рядка. Обидва вирази єеквівалентними, але з метою збільшення читабельності запиту переважно використовують другий варіант.
Слід зазначити, що конструктор рядка може бути використаний не тільки звкладеними запитами, але й у звичайних запитах, як це представлено внаступному прикладі, де з таблиці products витягуються параметри товарних позицій, число яких на складі дорівнює 6, а оцінка 4.
Приклад
SELECT name, price, count, mark FROM products
WHERE (6,4) = (count,mark);
name price count mark
Mustek P4P80C-VM\L 1665G 251.00 6 4.0
MusSTEK V9S20X 160.00 6 4.0
Запит з прикладу можна переписати так
SELECT name, price, count, mark FROM products
WHERE count = 5 and mark = 4;
name price count mark
Epox EP-4PDA3I 228.00 5 4.0
Samsung SP0812C 209.00 5 4.0
Нехай потрібно з'ясувати час оформлення замовлення на товар, ціна якогоперевищує 100 грн., Всіма відвідувачами зі статусом gold.
SELECT ordertime FROM orders
WHERE (id_user, id_product) IN (SELECT users.id_user,
products. id__product
FROM users, products
WHERE products.price > 1000 AND users.status = 'gold');
ordertime
2005-02-10 09:40:29
Як видно з запиту, поданого в прикладі, після конструктора рядка використовується конструкція in. Це пов'язано з тим, що вкладений запит можеповернути більше одного рядка і застосування знака рівності "=" призведе до виникнення помилки 1242 - вкладений запит повернув більше одного рядка.
Зауваження
При порівнянні конструктора рядка і результатів, які повернув вкладений запит, не слід застосовувати оператори, відмінні від рівності "=" і in, т як. результатможе бути непередбачуваним.
Рядкові запити часто використовуються для порівняння таблиць один з одним.Нехай таблиці tbl1 і tbl2 складаються з трьох стовпців col1, соl2 і соl3. Тодізнайти рядки таблиці tbl1, які є також і в таблиці tbl2, можна за допомогоюпредставленого запиту.
SELECT coll, col2r col3 FROM tbll
Where ROW(coll, col2, col3) IN (SELECT coll, col2, col3 FROM tbl2);