IN or JOIN

From: gearond(at)fireserve(dot)net
To: <pgsql-general(at)postgresql(dot)org>
Subject: IN or JOIN
Date: 2004-09-26 00:20:54
Message-ID: 200409260020.i8Q0Kss0007741@phaze.fireserve.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

please CC me as I am on digest
-------------------------------

I have three tables, simplified for, well, simplicity :-)

CREATE TABLE Usrs (
usr_id serial primary NOT NULL,
name text NOT NULL,
login text NOT NULL,
CONSTRAINT PK_Usrs PRIMARY KEY (usr_id)
);

CREATE TABLE EmailAddrs (
email_addr_id SERIAL NOT NULL,
email_addr VARCHAR(255) NOT NULL UNIQUE,
CONSTRAINT PK_EmailAddrs PRIMARY KEY (email_addr_id)
);

CREATE TABLE UsrEmails (
usr_id INT4 NOT NULL,
email_addr_id INT4 NOT NULL,
CONSTRAINT PK_UsrEmails PRIMARY KEY (usr_id, email_addr_id)
);

ALTER TABLE UsrEmails
ADD CONSTRAINT EmailAddrs11_0MUsrEmail
FOREIGN KEY (email_addr_id)
REFERENCES EmailAddrs (email_addr_id);

ALTER TABLE UsrEmails
ADD CONSTRAINT UsrEmailTypes11_0MUsrEmails
FOREIGN KEY (usr_email_type_id)
REFERENCES UsrEmailTypes (usr_email_type_id);

multiple 'Usrs' can have the same name, but different logins.

I want to find the count of usrs that:
have the name 'some_name'
and
have the email 'some_email'

-----------------------------
Should I use a JOIN or an IN?
If the 'IN' example below is right, and there is either:

NO Usr with name='some_name'
OR
NO email with email='some_email'

will it return a NULL, or a '0' count?

my thought for an IN:
----------------------
SELECT COUNT(*)
FROM UsrEmails
WHERE
usr_id IN
(SELECT usr_id
FROM Usrs
WHERE name='some_name'::text)
AND
email_addr_id=(SELECT email_addr_id
FROM Emails
WHERE email='some_email'::text);

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Doug McNaught 2004-09-26 00:33:59 Re: serial data type
Previous Message Joseph Healy 2004-09-26 00:01:33 Re: serial data type