Вкладені запити, які повертають декілька стовпців

До цих пір розглядалися вкладені запити, які повертають єдиний стовпець,проте в СУБД 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);