我有一个使用create和insert into语句填充了一些数据的数据库。我编写了一个带有WHERE子句的SELECT语句。我遇到的问题是,当我运行语句时,我发现有些数据因为我不理解的原因而重复。
这是我试图运行的声明。
SELECT Customer_Contact, Customer.CustomerID, Ord.OrderID,ItemOrdered.BeltLength,ItemOrdered.Colour,
ItemOrdered.Quantity,Design.DesignStyle
FROM Customer, Ord, ItemOrdered,Design
WHERE Customer.CustomerID = Ord.CustomerID
and Customer.Customer_Contact = 'John Daley'
and Design.DesignStyle ='Flat-Engraved';
以下链接显示了我用于创建上述语句的所有相关代码。 [数据库代码] [1]
我已按以下格式列出:
CREATE STATEMENT
INSERT INTO STATEMENT
扩展了Where子句,如下所示:
SELECT Customer_Contact, Customer.CustomerID, Ord.OrderID,ItemOrdered.BeltLength,ItemOrdered.Colour,
ItemOrdered.Quantity,Design.DesignStyle
FROM Customer, Ord, ItemOrdered,Design
WHERE Customer.CustomerID = Ord.CustomerID and
ItemOrdered.OrderID = Ord.OrderID
and Customer.Customer_Contact = 'John Daley' and
Design.DesignStyle ='Flat-Engraved';
这样可行,但是当我运行该语句时,它会显示3条完全相同的记录。
SELECT Customer.Customer_Contact,
Customer.CustomerID,
Ord.OrderID,
ItemOrdered.BeltLength,
ItemOrdered.Colour,
ItemOrdered.Quantity,
Design.DesignStyle
FROM Customer,
Ord,
ItemOrdered,
BeltID
Design
WHERE Customer.CustomerID = Ord.CustomerID
AND Ord.OrderID = ItemOrdered.OrderID
AND Customer.Customer_Contact = 'John Daley'
AND Design.DesignStyle ='Flat-Engraved'
AND BeltID.DesignID = Design.DesignID;
上面的陈述给我一个无效的标识符错误,我似乎不明白为什么?
答案 0 :(得分:3)
您的WHERE子句似乎相当宽松。 Customer to Ord join看起来非常强大但是ItemOrdered甚至没有出现在可能导致Cartesian Join的WHERE子句中。
答案 1 :(得分:2)
在这里查看你的创建语句是我如何创建大多数联接。然而,Design表似乎没有被任何其他表引用,因此需要更多信息来完成查询
SELECT
Customer_Contact,
Customer.CustomerID,
Ord.OrderID,
ItemOrdered.BeltLength,
ItemOrdered.Colour,
ItemOrdered.Quantity --,
--Design.DesignStyle
FROM
Customer,
INNER JOIN Ord
ON Customer.CustomerID = Ord.CustomerID
INNER JOIN ItemOrdered
ON ord.OrderID = ItemOrderd.OrderID
-- INNER JOIN design
WHERE
Customer.Customer_Contact = 'John Daley'
--and Design.DesignStyle ='Flat-Engraved';
答案 2 :(得分:1)
您似乎想要从Design和ItemOrdered表中选择一些内容,但是您没有将它们包含在您的联接中。
您可能需要扩展where子句(使用和 - 语句),将ItemOrdered和Design表链接到Customer或Customer_Contract表。
答案 3 :(得分:0)
通常,如果要将N个表连接在一起,则需要提供至少N-1个连接条件。由于您要加入4个表,因此通常需要至少3个连接条件。如果DesignStyle列的意图是唯一的(从您链接到的DDL中不清楚)那么这应该有效。
SELECT Customer.Customer_Contact,
Customer.CustomerID,
Ord.OrderID,
ItemOrdered.BeltLength,
ItemOrdered.Colour,
ItemOrdered.Quantity,
Design.DesignStyle
FROM Customer,
Ord,
ItemOrdered,
Design
WHERE Customer.CustomerID = Ord.CustomerID
AND Ord.OrderID = ItemOrdered.OrderID
AND Customer.Customer_Contact = 'John Daley'
AND Design.DesignStyle ='Flat-Engraved';
但是,通常情况下,您的数据模型将具有某种Item表,该表具有Design表的外键,而ItemOrdered表将是Item表和Order表之间的交集。这将使联接变得更加明智。