Domanda

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.

È stato utile?

Soluzione

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top