SQL乐园(19):交叉查询
软件世界
交叉查询
前两期我们介绍了进行多表查询的“新”方法和“老”方法。在“新”方法中,我们用到了“INNER JOIN”,它实际上是内部连接的意思。而内部连接的工作原理我们在第17期E15版已做了详细介绍,这里就不详述了。
我们仍从一个例子着手。有一个帽子经销商,他已经建立了一个记录帽子款式的数据表Style和一个记录帽子颜色的数据表Color,现在他想制作一个记录所有货品(不同款式不同颜色)的数据表Product,该怎么办呢?
交叉连接
交叉连接,也叫笛卡儿连接,是指把一个表的每条记录分别与另一个表的每条记录进行组合的连接方式。要解决上面的问题,我们只须执行下面的语句:
SELECT Style.StyleName,Color.Color name FROM Style CROSS JOIN Color
其中,CROSS关键字表明连接的类型。
工作原理
下面我们用图表的方式说明交叉连接的工作原理。表1和表2是Style表和Color表的结构和数据。执行了上面的语句后,得到的数据集合的内容如表3所示。很明显,表3的记录为表1的每一条记录与表2的每一条记录组合的结果,表3中的记录数就是表1中记录数和表2中记录数的乘积。
思考
细心的读者会发现,其实应用前两期学习的进行多表查询的“新”、“老”方法我们也完全可以实现上例中的功能:
SELECT A.StyleName,B.ColorName FROM Style AS A,Color As B
或SELECT A.StyleName,B.ColorName FROM Style AS A INNER JOIN Color AS B ON A.ID!=0
这是为什么呢?原来在SQL-2及以后的标准中,交叉连接和内部连接的语法格式非常相似,所不同的只是关键字。如果没有指定连接条件或者指定一个肯定符合的条件,则内部连接的结果与交叉连接的结果相同。
预告:下期我们一起来认识外部连接。
上期问题:用“新方法”在Northwind数据库Products表和“Order Details”表中,找出卖价(在“Order Details”表中的UnitPrice)比定价(在Products表中的Unit
Price)便宜的产品的编号、名称、订单编号、卖价、定价和价格差,并分别用中文命名。
参考答案:SELECT A.ProductID AS 产品编号,A.ProductName AS 产品名称,
B.OrderID AS 订单编号, A.UnitPrice AS 定价,B.UnitPrice AS 卖价,
B.UnitPrice-A.UnitPrice AS 价格差
FROM Products AS A
INNER JOIN
"Order Details" AS B
ON A.ProductID=B.ProductID
AND A.UnitPrice> B.UnitPrice
本期问题:假设有Store表(ID:仓库号,StoreName:仓库名称)和Products表(ID:货物号,StoreName:货物名称),求交叉连接后的结果集和记录总数。
本期的幸运读者是江苏的沈天誉,他将获得《全民学电脑──电脑入门》(含1CD)一本。请朋友们在答题的E-mail中注明通讯地址,以便邮寄奖品。


