Вы, вероятно, не можете написать простые запросы в MySQL для достижения этой цели. Но ANSI SQL поддерживает table value constructor
, что упрощает этот тип запроса.
Этот базовый запрос возвращает полный список заказов (5 строк):
SELECT * FROM Products
JOIN Orders_Products ON Orders_Products.PRODUCT_ID = Products.PRODUCT_ID
JOIN Orders ON Orders_Products.ORDER_ID = Orders.ORDER_ID
Этот запрос с table value constructor
возвращает нужные вам заказы:
SELECT * FROM Products
JOIN Orders_Products ON Orders_Products.PRODUCT_ID = Products.PRODUCT_ID
JOIN Orders ON Orders_Products.ORDER_ID = Orders.ORDER_ID
LEFT JOIN (VALUES('P1', 'T1'), ('P2', 'T3')) V(P_NAME, P_TITLE) ON PRODUCT_NAME = P_NAME AND PRODUCT_TITLE=P_TITLE
Этот запрос группирует вышеприведенный запрос, возвращая ORDER_ID, в котором нет порядка вне требуемого списка (исключая ордера, в которых есть строки, содержащие ноль):
SELECT ORDER_ID FROM Products
JOIN Orders_Products ON Orders_Products.PRODUCT_ID = Products.PRODUCT_ID
JOIN Orders ON Orders_Products.ORDER_ID = Orders.ORDER_ID
LEFT JOIN (VALUES('P1', 'T1'), ('P2', 'T3')) V(P_NAME, P_TITLE) ON PRODUCT_NAME = P_NAME AND PRODUCT_TITLE=P_TITLE
GROUP BY ORDER_ID HAVING COUNT(*) = 2
Среди баз данных с открытым исходным кодом HSQLD B - это та, которая поддерживает конструктор табличных значений и другие удобные функции ANSI SQL: 2008