Unix Technical Forum

SEO

vBulletin Search Engine Optimization


Go Back   Unix Technical Forum > Database Server Software > MySQL

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 05-10-2008, 02:03 PM
superman183
 
Posts: n/a
Default Novice MySQL Query

Hi,

Hoping someone can assist me with a query I have.

I have two tables, both of which have at least one field of the same
name, type, etc, etc. This field I will call SKEY, for the purposes of
this post. SKEY is a CHAR field, 4 chars in length.

One of the tables, we'll say Table1, has the complete list of
available SKEY's. Table2, on the other hand, contains only some of the
available SKEY's.

I want to be able to find out which SKEY's are missing from Table2;
ie. which SKEY's are in Table1, but not in Table2.

I have tried several different queries, but generally end up in a bit
of a mess, more often returning tens of thousands of results, when in
fact there are only a couple of hundred records in total.

My pseudo-code would be something like:

SELECT SKEY FROM TABLE1 WHERE TABLE1.SKEY NOT LIKE TABLE2.SKEY

The basic query which I tried is:

SELECT TABLE1.SKEY FROM TABLE1 JOIN TABLE2 WHERE TABLE1.SKEY NOT LIKE
TABLE2.SKEY

I also tried a few variations, with DISTINCT, etc, etc ... but I never
end up with anything close to what I need.

So, I'm sure I'm missing some basic knowledge about such a query. I
realise I'm getting thousands of records returned because it's testing
every single record in Table1 against every single record in
Table2 ... but I don't get how to do the type of query I want.

Any assistance much appreciated!

Superman183
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 05-10-2008, 02:03 PM
Rik Wasmus
 
Posts: n/a
Default Re: Novice MySQL Query

superman183 wrote:
> Hoping someone can assist me with a query I have.
>
> I have two tables, both of which have at least one field of the same
> name, type, etc, etc. This field I will call SKEY, for the purposes of
> this post. SKEY is a CHAR field, 4 chars in length.
>
> One of the tables, we'll say Table1, has the complete list of
> available SKEY's. Table2, on the other hand, contains only some of the
> available SKEY's.
>
> I want to be able to find out which SKEY's are missing from Table2;
> ie. which SKEY's are in Table1, but not in Table2.
>
> I have tried several different queries, but generally end up in a bit
> of a mess, more often returning tens of thousands of results, when in
> fact there are only a couple of hundred records in total.
>
> My pseudo-code would be something like:
>
> SELECT SKEY FROM TABLE1 WHERE TABLE1.SKEY NOT LIKE TABLE2.SKEY
>
> The basic query which I tried is:
>
> SELECT TABLE1.SKEY FROM TABLE1 JOIN TABLE2 WHERE TABLE1.SKEY NOT LIKE
> TABLE2.SKEY
>
> I also tried a few variations, with DISTINCT, etc, etc ... but I never
> end up with anything close to what I need.


If SKEY in TABLE2 cannot be null.

SELECT TABLE1.SKEY FROM TABLE1
LEFT JOIN TABLE2 ON TABLE2.SKEY = TABLE1.SKEY
WHERE TABLE2,SKEY IS NULL;
--
Rik Wasmus
[SPAM]
Now looking for some smaller projects to work on to fund a bigger one
with delayed pay. If interested, mail rik at rwasmus.nl
[/SPAM]
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 05-10-2008, 02:03 PM
user
 
Posts: n/a
Default Re: Novice MySQL Query

On Fri, 09 May 2008 04:44:55 -0700, superman183 wrote:

> Hi,
>
> Hoping someone can assist me with a query I have.
>
> I have two tables, both of which have at least one field of the same
> name, type, etc, etc. This field I will call SKEY, for the purposes of
> this post. SKEY is a CHAR field, 4 chars in length.
>
> One of the tables, we'll say Table1, has the complete list of available
> SKEY's. Table2, on the other hand, contains only some of the available
> SKEY's.
>
> I want to be able to find out which SKEY's are missing from Table2; ie.
> which SKEY's are in Table1, but not in Table2.
>
> I have tried several different queries, but generally end up in a bit of
> a mess, more often returning tens of thousands of results, when in fact
> there are only a couple of hundred records in total.
>
> My pseudo-code would be something like:
>
> SELECT SKEY FROM TABLE1 WHERE TABLE1.SKEY NOT LIKE TABLE2.SKEY
>
> The basic query which I tried is:
>
> SELECT TABLE1.SKEY FROM TABLE1 JOIN TABLE2 WHERE TABLE1.SKEY NOT LIKE
> TABLE2.SKEY
>
> I also tried a few variations, with DISTINCT, etc, etc ... but I never
> end up with anything close to what I need....



Have you tried this code?

select skey from table1, table2 where table1.skey not in table2.skey

Or, pulling your complete second table as a sub-query (I think this may
be needed; it's been a while):

select a.skey from table1 a, (select distinct skey from table2) b where
a.skey not in b

Luck

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #4 (permalink)  
Old 05-13-2008, 06:13 PM
superman183
 
Posts: n/a
Default Re: Novice MySQL Query

Many thanks to all respondents, much appreciated!

Superman183


Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #5 (permalink)  
Old 05-13-2008, 06:13 PM
Captain Paralytic
 
Posts: n/a
Default Re: Novice MySQL Query

On 9 May, 23:31, user <u...@127.0.0.1> wrote:
> On Fri, 09 May 2008 04:44:55 -0700, superman183 wrote:
> > Hi,

>
> > Hoping someone can assist me with a query I have.

>
> > I have two tables, both of which have at least one field of the same
> > name, type, etc, etc. This field I will call SKEY, for the purposes of
> > this post. SKEY is a CHAR field, 4 chars in length.

>
> > One of the tables, we'll say Table1, has the complete list of available
> > SKEY's. Table2, on the other hand, contains only some of the available
> > SKEY's.

>
> > I want to be able to find out which SKEY's are missing from Table2; ie.
> > which SKEY's are in Table1, but not in Table2.

>
> > I have tried several different queries, but generally end up in a bit of
> > a mess, more often returning tens of thousands of results, when in fact
> > there are only a couple of hundred records in total.

>
> > My pseudo-code would be something like:

>
> > SELECT SKEY FROM TABLE1 WHERE TABLE1.SKEY NOT LIKE TABLE2.SKEY

>
> > The basic query which I tried is:

>
> > SELECT TABLE1.SKEY FROM TABLE1 JOIN TABLE2 WHERE TABLE1.SKEY NOT LIKE
> > TABLE2.SKEY

>
> > I also tried a few variations, with DISTINCT, etc, etc ... but I never
> > end up with anything close to what I need....

>
> Have you tried this code?
>
> select skey from table1, table2 where table1.skey not in table2.skey
>
> Or, pulling your complete second table as a sub-query (I think this may
> be needed; it's been a while):
>
> select a.skey from table1 a, (select distinct skey from table2) b where
> a.skey not in b
>
> Luck


Luck, good name

A lot of luck will be needed to get your first proposal to work.

As to your second one, Rik's solution does it far more efficiently.

As a general rule, use JOINs (or LEFT JOINs) wherever possible and
avoid sub-selects such as yours.

Also, always code explicit JOINs rather than implicit comma joins.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT. The time now is 07:12 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145