Question

In SQL+, I've created 2 tables to store data and 1 to cross reference them. The goal is to be able to write a single query that will show me what car is in which dealership, and which dealership offers which car, etc. The problem is that when I query anything, each car is in each dealership.

drop table car_dealer;
drop table car;
drop table dealer;

create table dealer(
    did     NUMBER PRIMARY KEY,
    dname       VARCHAR2(20) 
);
create table car(
    cid     NUMBER PRIMARY KEY,
    cname       VARCHAR2(20)
);
create table car_dealer(
    cid     NUMBER REFERENCES car(cid),
    did     NUMBER REFERENCES dealer(did),
    CONSTRAINT pk_car_dealer PRIMARY KEY (cid,did)
);

INSERT INTO car
VALUES (1,'Buick Skylark');

INSERT INTO car 
VALUES (2,'H2 Hummer');

INSERT INTO car 
VALUES (3,'Chevy Suburban');

INSERT INTO car 
VALUES (4,'BMW Z3');

INSERT INTO car 
VALUES (5,'BMW 328i');

INSERT INTO car 
VALUES (6,'Jeep Wrangler');

INSERT INTO car
VALUES (7,'Ford Focus');

INSERT INTO car 
VALUES (8,'Range Rover');

INSERT INTO car 
VALUES (9,'Toyota Supra');

INSERT INTO car 
VALUES (10,'Ferrari Testarosa');

INSERT INTO car
VALUES (11,'Jaguar X12');

INSERT INTO car 
VALUES (12,'Ford Fairmont');

INSERT INTO dealer
VALUES (100,'Midnight Movers');

INSERT INTO dealer 
VALUES (200,'Bubbas Imports');

INSERT INTO dealer
VALUES (300,'Import Motors');

INSERT INTO car_dealer (cid,did)
VALUES (1,100);

INSERT INTO car_dealer (cid,did)
VALUES (2,100);

INSERT INTO car_dealer (cid,did)
VALUES (3,100);

INSERT INTO car_dealer (cid,did)
VALUES (4,100);

INSERT INTO car_dealer (cid,did)
VALUES (5,100);

INSERT INTO car_dealer (cid,did)
VALUES (6,100);

INSERT INTO car_dealer (cid,did)
VALUES (1,200);

INSERT INTO car_dealer (cid,did)
VALUES (2,200);

INSERT INTO car_dealer (cid,did)
VALUES (3,200);

INSERT INTO car_dealer (cid,did)
VALUES (4,200);

INSERT INTO car_dealer (cid,did)
VALUES (5,200);

INSERT INTO car_dealer (cid,did)
VALUES (6,200);

INSERT INTO car_dealer (cid,did)
VALUES (7,300);

INSERT INTO car_dealer (cid,did)
VALUES (8,300);

INSERT INTO car_dealer (cid,did)
VALUES (9,300);

INSERT INTO car_dealer (cid,did)
VALUES (10,300);

INSERT INTO car_dealer (cid,did)
VALUES (11,300);

INSERT INTO car_dealer (cid,did)
VALUES (12,300);

select  dname,
    cname
from    dealer,car
where   did = 200;

select  dname,
cname
from    dealer,car
where   cid = 4;

Midnight Movers(100) and Bubba's Imports(200) should both have cars 1-6 only, and Import Motors(300) should have cars 7-12 only. Instead all dealerships have all cars, and I would like some help figuring out why.

Was it helpful?

Solution

This is what happens when you don't specify the joins. To get proper results you should change your queries to the following:

SELECT 
    d.dname, c.cname
FROM 
    car_dealer cd
JOIN 
    car c ON cd.cid = c.cid
JOIN 
    dealer d ON cd.did = d.did
WHERE 
    cd.did = 200;

SELECT 
    d.dname, c.cname
FROM 
    car_dealer cd
JOIN 
    car c ON cd.cid = c.cid
JOIN 
    dealer d ON cd.did = d.did
WHERE 
    cd.cid = 4;

Here SQL Fiddle http://sqlfiddle.com/#!4/98833/4

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top