Rivka
Rivka

Reputation: 2202

SQL Join only if all records have a match

I have 3 tables:

There can be multiple idCartRows per idOrder.

I want to get all orders where all its idCartRows exist in CP_shipping. This seems like it should be simple, but I haven't found much on the web.

Here's my query now:

SELECT
    s.idOrder
    , s.LatestDateShipped
FROM
    CP_carthead o
    LEFT OUTER JOIN (
                        SELECT
                            MAX(s.dateShipped) [LatestDateShipped]
                            , r.idOrder
                        FROM
                            CP_shipping s
                            LEFT OUTER JOIN CP_cartrows r ON s.idCartRow = r.idCartRow
                        GROUP BY
                            r.idOrder               
                    ) s ON o.idOrder = s.idOrder

Upvotes: 4

Views: 6297

Answers (1)

Gordon Linoff
Gordon Linoff

Reputation: 1269443

Your query is returning rows from "s" and not the orders. Based on your question, I came up with this query:

select o.*
from CP_Carthead o
where o.orderId in (select cr.idOrder
                    from cp_cartrows cr left outer join
                         cp_shipping s
                         on cr.idCartRow = s.IdCartrow  
                    group by cr.idOrder
                    having count(s.idCartRow) = COUNT(*)
                   )

The subquery in the in statement is getting orders all of whose cartrows are in shipping.

Upvotes: 3

Related Questions