Subconsultas de varias columnas

Hasta ahora solo hemos visto subconsultas que devuelven una columna. Pero también podemos trabajar con subconsultas que devuelven varias columnas y varias filas (tablas derivadas).

Comparación por varias columnas

SQL no solo permite comparar por una columna: también permite comparar por parejas los valores de la consulta principal con los valores de la subconsulta.

Por ejemplo, si queremos obtener la información de todas las reservas en las que el precio del alojamiento en el momento de la reserva (Reservations.price) coincide con el precio actual del alojamiento (Rooms.price), podemos hacerlo así:

MySQL 8.4
SELECT * FROM Reservations
    WHERE (room_id, price) IN (SELECT id, price FROM Rooms);
iduser_idroom_idstart_dateend_datepricetotal
51712019-02-02T12:00:00.000Z2019-02-04T12:00:00.000Z149298
61422020-03-21T09:00:00.000Z2020-03-23T09:00:00.000Z225450
719132020-03-21T10:00:00.000Z2020-04-21T10:00:00.000Z892759
829162019-06-14T10:00:00.000Z2019-06-24T10:00:00.000Z1401400
127192020-05-01T10:00:00.000Z2020-05-02T10:00:00.000Z9999
141372019-09-13T10:00:00.000Z2019-09-17T10:00:00.000Z60240
151252020-05-14T10:00:00.000Z2020-05-15T10:00:00.000Z8080
161052020-03-26T10:00:00.000Z2020-03-27T10:00:00.000Z8080
1711502019-11-18T11:00:00.000Z2019-11-25T11:00:00.000Z80560
1928492020-04-01T11:00:00.000Z2020-04-02T11:00:00.000Z115115
201492020-06-01T10:00:00.000Z2020-06-11T10:00:00.000Z1151150
212482019-11-07T10:00:00.000Z2019-11-10T10:00:00.000Z110330
2212322020-01-14T13:00:00.000Z2020-01-18T13:00:00.000Z52208
2312322019-09-17T13:00:00.000Z2019-09-18T13:00:00.000Z5252
247192020-01-08T13:00:00.000Z2020-01-11T13:00:00.000Z99297
2518192019-11-01T10:00:00.000Z2019-11-16T10:00:00.000Z991485
2621172019-11-03T09:00:00.000Z2019-11-05T09:00:00.000Z215430
2731252020-04-20T09:00:00.000Z2020-04-22T09:00:00.000Z120240
2821142020-02-08T10:00:00.000Z2020-02-12T10:00:00.000Z85340
2921392019-12-08T10:00:00.000Z2019-12-09T10:00:00.000Z150150

En este ejemplo, la subconsulta devuelve una tabla con los identificadores de los alojamientos y su precio actual:

MySQL 8.4
SELECT id, price FROM Rooms
idprice
1149
2225
3150
489
580
6200
760
879
979
10150
11135
1285
1389
1485
15120
16140
17215
18140
1999
20190
21299
22130
2380
24110
25120
2660
2780
28150
2944
30180
3150
3252
3355
3450
3570
3689
3735
3885
39150
4040
4168
42120
43120
44135
45150
46150
47130
48110
49115
5080

Y después, con esta tabla, limitamos todas las reservas a aquellas en las que la pareja de valores room_id y price aparece en la tabla de la subconsulta.

Esta misma solución se podría hacer sin comparar por varias columnas, pero sería más larga:

MySQL 8.4
SELECT Reservations.* FROM Reservations
INNER JOIN Rooms
ON Reservations.room_id = Rooms.id
WHERE Reservations.price = Rooms.price;