Re: simple query

From: Jared Still <jkstill_at_gmail.com>
Date: Tue, 29 Jul 2008 16:04:16 -0700
Message-ID: <bf46380807291604q439c0c4bsaf383e573b8cd8e8@mail.gmail.com>


On Tue, Jul 29, 2008 at 1:56 PM, Lyall Barbour <lyallbarbour_at_sanfranmail.com
> wrote:

> Need a query that will get all the customers who have not ordered a certain
> item, ever.
>
> Have a ORDDETAIL table that links with ORDHEADER with an ORD_NBR column.
> In the ORDDETAIL table, it has a row for each item on the order.
> The ORDHEADER has the CUST_CD along with the ORD_NBR.
>
> I've tried
>
> SELECT a.cust_cd
> FROM ordheader a, orddetail b
> WHERE a.ord_nbr = b.ord_nbr
> AND b.item_cd not in (<list of items>)
>
>

Get all possible orders

  select c.cust_cd. i.item_cd
  from customers c, items i

Now find what has actually been ordered by customers

  select c.cust_cd, i.item_cd
  from customers c, ordheader oh, orddetail od, items i   where c.cust_cd = oh.cust_cd
  and od.ord_nbr = oh.ord_nbr
  and i.item_cd = od.item_cd

Subtracts orders from potential orders

  select c.cust_cd. i.item_cd
  from customers c, items i
  minus
  select c.cust_cd, i.item_cd
  from customers c, ordheader oh, orddetail od, items i   where c.cust_cd = oh.cust_cd
  and od.ord_nbr = oh.ord_nbr
  and i.item_cd = od.item_cd

BTW, I don't recommend you run this particular bit of SQL, as it is for instructional purposes only. It may cause havoc in your database.

For a smallish data set this query is feasible, but it is mostly just used to illustrate what needs to be done.

By introducing a table with your list of items, the cartesian join created by customers and items will become more limited

  select c.cust_cd. itc.item_cd
  from customers c, items_to_chk itc
  minus
  select c.cust_cd, i.item_cd
  from customers c, ordheader oh, orddetail od, items i   where c.cust_cd = oh.cust_cd
  and od.ord_nbr = oh.ord_nbr
  and i.item_cd = od.item_cd

That's one simple way to do it.

Had you provided DDL and test data, I would have tested it. :)

-- 
Jared Still
Certifiable Oracle DBA and Part Time Perl Evangelist

--
http://www.freelists.org/webpage/oracle-l
Received on Tue Jul 29 2008 - 18:04:16 CDT

Original text of this message