Hello I can’t figure out how to write this select statement. I have the following schema: table 1 1:n table 2 n:1 table 3 So I got a n:m between table 1 and 3 what I want to do now is get all entries in table 1 that either don’t have an relation to table 3 via table 2 or if there exists a relation I want only those not matching one specific table 3 primary key. Or in other words if table 1 is products and table 3 is orders, I want to get out all products not already placed in the specific order I’m giving into the select. I already tried a vaiety of select commands but none of them were working properly, hardest thing for me is the ‘not equals orders_id’ part so far I only got an empty table as a result. I did a small paint drawing so you can understand better what I’m trying to do.
Advertisement
Answer
I would recommend not exists
:
select p.* from products p where not exists ( select 1 from product_orders po where po.product_id = o.product_id and po.order_id = ? )
The question mark represents the id of the order that you give as a parameter to the query.
I doubt that you need table orders
to generate the result you want – unless you are identifying the order by some other column than its primary key. If so, that would be:
select p.* from products p where not exists ( select 1 from product_orders po inner join orders o on o.order_id = po.order_id where po.product_id = o.product_id and o.<somecol> = ? )