0

这来自现代数据库管理文本,第 12 章。鉴于:

Supplier_T(SupplierNumber,City)                10,000 records, stored in Detroit
Part_T(PartNumber, Color)                      100,000 records, stored in Chicago
Shipment_T(SupplierNumber, PartNumber)         1,000,000 records, stored in Detroit

用 SQL 编写的查询列出了克利夫兰红色零件供应商的供应商编号,第 19 页给出的是:

SELECT Supplier_T.SupplierNumber
FROM Supplier_T, Shipment_T, Part_T
WHERE Supplier_T.City = 'Cleveland'
AND Shipment_T.PartNumber = Part_T.PartNumber
AND Part_T.Color = 'Red';

但是 WHERE 子句中不是缺少它吗?

AND Supplier_T.SupplierNumber = Shipment_T.SupplierNumber

也许我只是太迂腐了。

4

1 回答 1

1

给出这个例子很可能是为了说明当一个人忘记在表之间连接时会发生什么!这称为笛卡尔连接,结果是每一行都连接到其他每一行,产生的结果集比预期的要大得多。

我想如果查询的目的是显示存储在克利夫兰的红色部分,那么查询将是

SELECT Supplier_T.SupplierNumber
FROM Supplier_T
inner join Shipment_T on Shipment_T.suppliernumber = supplier_t.suppliernumber
inner join Part_T on Part_T.PartNumber = Shipment_T.PartNumber
WHERE Supplier_T.City = 'Cleveland'
AND Part_T.Color = 'Red';  

查询使用 SQL-89 隐式连接语法(来自 table1、table2、table3)而不是 SQL-92 显式连接语法(来自 table1 内连接 table2)这一事实应该暗示有问题!此查询的文本中写了什么?

于 2013-05-04T04:26:30.283 回答