我的带有join的sql语句出了什么问题

时间:2014-06-27 02:55:07

标签: sql select

我正在做这个测试sql http://sql-ex.ru/learn_exercises.php

问题是这个

数据库方案由四个表组成:

Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)

表"产品"包括有关制造商,型号和类型的信息(' PC','笔记本电脑'打印机')。假设Product表中的型号对于所有制造商和产品类型都是唯一的。每台PC通过表格中的代码唯一指定" PC"的特点是型号(引用Product表的外键),速度(处理器的速度,以MHz为单位),RAM的总量 - ram(以Mb为单位),硬盘驱动器容量 - hd(以Gb为单位),CD ROM速度 - cd(例如,' 4x')和价格。表"笔记本电脑"除了CD ROM速度之外,它类似于PC之一,它被屏幕尺寸 - 屏幕(以英寸为单位)取代。对于表格中的每台打印机"打印机"它被告知打印机是否是彩色的(颜色属性是' y'对于彩色打印机;否则它是' n'),打印机类型(激光,喷射或矩阵),和价格。

要解决的问题

Exercise: 2 (Serge I: 2002-09-21)
Find printer makers.
Result set: maker.

我的查询是

select distinct(p.maker) from Product p
 inner join Printer pr on pr.model = p.model

它说

Your query produced correct result set on main database, but it failed test on second, checking database.
* Wrong number of records (less by 3)

我不明白这个问题是什么

2 个答案:

答案 0 :(得分:1)

Modelprinter中不是唯一的。因此,如果您加入printer.Model,您可以获得“重复计算”。在他的解决方案中,他使用IN来解决重复计算问题。

例如,如果我们在Field1 = Field7上加入这些表

Table 1                     Table 2
Field1 Field2 Field3        Field7 Field8 Field3
A      B      C             A      Z      Z
B      Z      Z             A      Z      X
                            A      Z      F

你得到多少条记录?你得到4.你得到三个A + 1 B

它也可以像这样解决:

select p.maker from Product p
inner join 
(select DISTINCT model from Printer) pr 
on pr.model = p.model

或者像这样:

select p.maker from Product p
where exists (select 1 from Printer pr where pr.model = p.model)

答案 1 :(得分:1)

正如他所说的那样“......和类型('PC','笔记本电脑'或'打印机')......”这意味着类型字段实际上是一个文本字段,表示它所指的系统类型到。

“......对于表”打印机“中的每台打印机,都会告诉打印机是否为彩色(彩色打印机的颜色属性为'y';否则为'n'),打印机类型(激光,喷射,或矩阵),价格..“

它说打印机表中的行都有产品,但并不是所有打印机的产品都在打印机中都有行。这是x => y的情况,但y不是y => x

虽然您的查询应该产生相同的数据,但您的查询使用INNER JOIN意味着产品和Printer表都应具有该模型。

但是,他的意思是产品可能没有出现在打印机表中的打印机。

 SELECT DISTINCT maker 
 FROM Product  
 WHERE type = 'printer'

技术上也可以用

实现
SELECT p1.maker 
FROM Product p1
LEFT JOIN Printer p2 
ON p1.model = p2.model
where p1.type = 'printer'

需要where子句,因为我告诉它显示products表中的所有数据。

这种情况下的连接不是解决方案,这是因为产品表中的打印机没有出现在打印机表中。