2013-09-22 79 views
0

以下SQL查询的目标是为每位居住在圣弗朗或洛杉矶的女性经理返回姓名和薪水。我很困惑,为什么这个问题要回归男性经理和女性经理......我原本以为定义约束“性别='F'”以及自然连接会消除所有男性经理列表马上。不产生正确结果的SQL查询

select Lastname, FirstName, MidInitial, salary, gender 
    from Employee natural join Works natural join Manages 
where Lastname = ManagerLastname and 
FirstName = MFirstName and 
MidInitial = MMidInitial and 
gender = 'F' and 
city = 'San Fran' or city = 'LA'; 

--RESULT: 
LASTNAME FIRSTNAME MIDINITIAL SALARY GENDER 
Brandy  Dan   L   42000 M 
Clemson  Ann   M   39000 F 
Gill  Mary  L   48700 F 
Simon  Eric  K   45000 M 

有谁看到什么内在的错误上面的查询? FYI:这里是该数据库的表的模式:

create table Employee(
    Lastname varchar(10), 
    FirstName varchar(10), 
    MidInitial char(1), 
    gender  char(1), 
    street  varchar(10), 
    city  varchar(10), 
    primary key(Lastname, FirstName, MidInitial)); 

create table company(
    company_name varchar(20), 
    city varchar(10), 
    primary key(company_name)); 

create table Works(
    Lastname varchar(10), 
    FirstName varchar(10), 
    MidInitial char(1), 
    company_name varchar(20), 
    salary  numeric(8,2), 
    primary key(Lastname, FirstName, MidInitial, company_name), 
    foreign key(Lastname, FirstName, MidInitial) references Employee, 
    foreign key(company_name) references company); 

create table Manages(
    Lastname varchar(10), 
    FirstName varchar(10), 
    MidInitial char(1), 
    ManagerLastname varchar(10), 
    MFirstName varchar(10), 
    MMidInitial char(1), 
    start_date date, 
    primary key(Lastname, FirstName, MidInitial, ManagerLastname, MFirstName, MMidInitial), 
    foreign key(Lastname, FirstName, MidInitial) references Employee); 

此外,我使用SQL对的Oracle 11g R2。

谢谢你看看这个!

+0

,尝试按你的条件'姓= ManagerLastname和 名字= MFirstName和 MidInitial = MMidInitial和 gender ='F'and (city ='San Fran'or city ='LA')''或者不使用'OR'使用'IN'例如'Las tname = ManagerLastname和 FirstName = MFirstName和 MidInitial = MMidInitial和 gender ='F'和 city =('San Fran','LA')' –

回答

2

问题是AND的优先级高于OR

所以您的查询实际上是说:

显示我的所有记录,其中姓= ManagerLastname名字= MFirstNameMidInitial = MMidInitial性别= 'F'city ='San Fran'

- 或 -

城市= 'LA'

你想要的是:

where Lastname = ManagerLastname and 
FirstName = MFirstName and 
MidInitial = MMidInitial and 
gender = 'F' and 
(city = 'San Fran' or city = 'LA')