Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: Query Help

Re: Query Help

From: Charles Hooper <hooperc2000_at_yahoo.com>
Date: Fri, 21 Dec 2007 13:42:41 -0800 (PST)
Message-ID: <46d2ce29-a0f0-4065-8e37-af07dda96cba@i12g2000prf.googlegroups.com>


On Dec 21, 4:37 pm, Charles Hooper <hooperc2..._at_yahoo.com> wrote:
> On Dec 21, 4:11 pm, cnbla..._at_juno.com wrote:
> > On Dec 21, 2:06 pm, Charles Hooper <hooperc2..._at_yahoo.com> wrote:
> > > On Dec 21, 12:48 pm, cnbla..._at_juno.com wrote:
>
> > > > I am a beginning Oracle 9i user and I was hoping that someone can help
> > > > me.  I think I have the basic SQL statements down pat, but this
> > > > problem is a little too advanced for me.
>
> > > > Let's say that I have Table A with the following columns:  Food_ID,
> > > > Descr, Cat_ID and Status.  Here are some sample rows in the table:
> > > > 301  Apple  10  Active
> > > > 301  Ham  20 Inactive
> > > > 301  Carrot 30 Active
> > > > 302  Orange  10 Inactive
> > > > 302  Balony  20  Active
>
> > > > I would like to find all instances where the Food_ID does not have a
> > > > Cat_ID of 30 or has a Cat_ID of 30, but it is Inactive. In the example
> > > > shown above, I would see Food_ID of 302, but not 301.
>
> > > > Thank you,
>
> > > If you are famailar with BASIC programming, a similar construct might
> > > look like this:
> > >   IF (AGE <> 65) OR (AGE = 65 AND RETIRED = "Y") THEN
>
> > > The WHERE clause syntax in Oracle is similar to the above, if you omit
> > > the "IF" and the "THEN", and replace the double quotes with single
> > > quotes.  All that you would then need to do is substitute your column
> > > names and the values that you are checking.
>
> > > Charles Hooper
> > > IT Manager/Oracle DBA
> > > K&M Machine-Fabricating, Inc.
>
> > From what you have suggested, I would run something like the
> > following:
> > Select Distinct Food_ID
> > From Table A
> > Where (Cat_ID <> 30) OR (Cat_ID = 200 AND Status = 'I')
>
> > If I run the query that you suggest, wouldn't I see Food_ID 302
> > because there is one row for cat_ID 10 and another for 20?  I only
> > want to see a result of 302.  Thank you for your help and patience.
>
> Your translation is correct, however...
> If your data looks like this:
> Descr, Cat_ID, Status
> 301  Apple  10  Active
> 301  Ham  20 Inactive
> 301  Carrot 30 Active
> 302  Orange  10 Inactive
> 302  Balony  20  Active
>
> The portion of the WHERE clause (before the OR) would return the
> following, as it excludes everything where Cat_ID is equal to 30:
> Descr, Cat_ID, Status
> 301  Apple  10  Active
> 301  Ham  20 Inactive
> 302  Orange  10 Inactive
> 302  Balony  20  Active
>
> The second half of your WHERE clause (after the OR) would return no
> rows.
>
> I think that I now understand what you are trying to do: for each
> distinct value of DESCR, if any rows have a CAT_ID of 30 with a STATUS
> of Active, you want to completely exclude that DESCR value from the
> rows returned.  We need a different approach, if this is the case.
> First, we need to define the DESCR values that we want to exclude:
> SELECT DISTINCT
>   DESCR
> FROM
>   TABLEA
> WHERE
>   CAT_ID=30
>   AND STATUS='Active';
>
> The above will return 301, so we want to exclude that record.  There
> are multiple ways to accomplish this:
> SELECT DISTINCT
>   TA.DESCR
> FROM
>   TABLEA TA,
>   (SELECT DISTINCT
>     DESCR
>   FROM
>     TABLEA
>   WHERE
>     CAT_ID=30
>     AND STATUS='Active') TN
> WHERE
>   TA.CAT_ID=TN.CAT_ID(+)
>   AND TN.CAT_ID IS NULL;
>
> SELECT DISTINCT
>   TA.DESCR
> FROM
>   TABLEA TA
> MINUS
> SELECT DISTINCT
>   CAT_ID
> FROM
>   TABLEA
> WHERE
>   CAT_ID=30
>   AND STATUS='Active';
>
> SELECT DISTINCT
>   TA.DESCR
> FROM
>   TABLEA TA
> WHERE
>   TA.DESCR NOT IN (
>     SELECT DISTINCT
>       DESCR
>     FROM
>       TABLEA
>     WHERE
>       CAT_ID=30
>       AND STATUS='Active');
>
> There are often several ways to write a SQL statement to solve a
> particular problem, and some ways are more efficient than others.
>
> Charles Hooper
> IT Manager/Oracle DBA
> K&M Machine-Fabricating, Inc.

Slight correction of the first SQL statement to correct column names in the final WHERE clause:
An inline view:
SELECT DISTINCT
  TA.DESCR
FROM
  TABLEA TA,
  (SELECT DISTINCT
    DESCR
  FROM
    TABLEA
  WHERE
    CAT_ID=30
    AND STATUS='Active') TN
WHERE
  TA.DESCR=TN.DESCR(+)
  AND TN.DESCR IS NULL; Using MINUS:
SELECT DISTINCT
  TA.DESCR
FROM
  TABLEA TA
MINUS
SELECT DISTINCT
  CAT_ID
FROM
  TABLEA
WHERE
  CAT_ID=30
  AND STATUS='Active';

A subquery:
SELECT DISTINCT
  TA.DESCR
FROM
  TABLEA TA
WHERE
  TA.DESCR NOT IN (
    SELECT DISTINCT
      DESCR
    FROM
      TABLEA
    WHERE

      CAT_ID=30
      AND STATUS='Active');

Charles Hooper
IT Manager/Oracle DBA
K&M Machine-Fabricating, Inc. Received on Fri Dec 21 2007 - 15:42:41 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US