我正在开展一个学校项目,我们的任务是为建筑公司创建一个数据库。我创建了数据库并插入了所有数据。 但是我在解决其中一个所需的查询时遇到了困难。
请注意,所有列和表名都是丹麦语。
我需要创建一个查询,告诉我哪个部门(表Afdelinger.id
)只出售一层楼的房子(表HusType.Etageantal
)。只有一个部门可以做到这一点,那就是07(AfdId)部门。
无论我如何创建查询,我总是让所有部门出售一层房子或什么都没有,但这些部门也在出售2层房屋。所以我的查询应该只输出AfdId 07。 我尝试了这些查询,但他们没有给我正确的结果
select etageantal, id, udbyder.ModelNr from hustype
inner join udbyder
on id = id
where Etageantal like 1 = Etageantal not like 2
group by id;
select * from hustype
left join udbyder on hustype.modelnr = udbyder.modelnr
where Etageantal like 1
union
select * from hustype
right outer join udbyder on hustype.modelnr = udbyder.modelnr
where Etageantal like 1
order by id;
表Udbyder
是HusType
和Afdelinger
的联结表。
Create table Afdelinger(
AfdId int not null,
Navn varchar(45) not null,
PostNr int not null,
primary key(AfdId),
foreign key(PostNr) references PostNummer(PostNr)
) ENGINE=INNODB;
Create Table HusType(
ModelNr int(3) not null,
ModelNavn varchar(10) not null,
Kvm int(3) not null,
Etageantal int(1) not null,
primary key(ModelNr)
) ENGINE=INNODB;
Create table Udbyder(
HusPrisAfd decimal not null,
Id int not null,
ModelNr int(3) not null,
primary key(HusPrisAfd, Id),
unique(HusPrisAfd),
foreign key(Id) references Afdelinger(AfdId),
foreign key(ModelNr) references HusType(ModelNr)
) ENGINE=INNODB;
这是我的数据
表名= Afdelinger
+-------+---------------------+--------+
| AfdId | Navn | PostNr |
+-------+---------------------+--------+
| 1 | Herning | 7400 |
| 2 | Brønderslev | 9800 |
| 3 | Haderslev | 6100 |
| 4 | Højbjerg | 8270 |
| 5 | Brabrand | 8220 |
| 6 | Fyn | 5000 |
| 7 | Sjælland og Øerne | 4000 |
+-------+---------------------+--------+
Tbl name = Udbyder
+------------+----+---------+
| HusPrisAfd | Id | ModelNr |
+------------+----+---------+
| 1175000 | 2 | 102 |
| 1250000 | 1 | 100 |
| 1275000 | 2 | 103 |
| 1350000 | 1 | 101 |
| 1375000 | 2 | 104 |
| 1450000 | 1 | 102 |
| 1550000 | 1 | 103 |
| 1575000 | 3 | 100 |
| 1600000 | 3 | 102 |
| 1650000 | 2 | 100 |
| 1675000 | 3 | 101 |
| 1700000 | 3 | 103 |
| 1750000 | 2 | 101 |
| 1800000 | 3 | 104 |
| 1941666 | 4 | 102 |
| 1978508 | 4 | 103 |
| 2000000 | 4 | 100 |
| 2015350 | 5 | 101 |
| 2052192 | 5 | 102 |
| 2089035 | 5 | 103 |
| 2100000 | 4 | 101 |
| 2125877 | 5 | 104 |
| 2199561 | 6 | 100 |
| 2236403 | 6 | 101 |
| 2273245 | 6 | 102 |
| 2310087 | 6 | 103 |
| 2346929 | 6 | 104 |
| 2420614 | 7 | 102 |
+------------+----+---------+
Tbl name = Hustype
+---------+-----------+-----+------------+
| ModelNr | ModelNavn | Kvm | Etageantal |
+---------+-----------+-----+------------+
| 100 | H-Huset | 167 | 1 |
| 101 | U-Huset | 176 | 1 |
| 102 | L-Huser | 193 | 1 |
| 103 | Skagen | 212 | 2 |
| 104 | Funkis | 242 | 2 |
+---------+-----------+-----+------------+
答案 0 :(得分:0)
您需要一个子查询来完成此任务。首先,你需要让所有出售一层房屋的部门。你几乎得到了第一个查询,但你没有正确使用内连接语法。您应该使用ON hustype.ModelNr = udbyder.ModelNr
,因为ModelNr
表中的Udbyder
是根据您的表定义引用ModelNr
表中HusType
的外键。这是正确的查询:
SELECT hustype.etageantal, udbyder.id, udbyder.ModelNr
FROM hustype
INNER JOIN udbyder
ON hustype.ModelNr = udbyder.ModelNr
WHERE hustype.Etageantal = 1
您还可以通过以上查询获得销售一层和两层房屋的部门。下一步是获得出售两层房屋的部门的ID。以下查询将执行此操作:
SELECT udbyder.id
FROM hustype
INNER JOIN udbyder
ON hustype.ModelNr = udbyder.ModelNr
WHERE Etageantal <> 1
应从第一个查询的结果中删除从上述查询中获得的结果。您可以通过使用NOT IN
将上述查询作为子查询插入到第一个查询的where条件中来实现。以下是最终查询,它将返回仅出售一层房屋的所有部门:
SELECT hustype.etageantal, udbyder.id, udbyder.ModelNr
FROM hustype
INNER JOIN udbyder
ON hustype.ModelNr = udbyder.ModelNr
WHERE hustype.Etageantal = 1
AND udbyder.id NOT IN
(
SELECT udbyder.id
FROM hustype
INNER JOIN udbyder
ON hustype.ModelNr = udbyder.ModelNr
WHERE Etageantal <> 1
);
SQLFiddle演示:http://sqlfiddle.com/#!9/6ec673/13