条款声明重复数据的地方

时间:2010-12-13 15:08:46

标签: sql oracle

我有一个使用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;

上面的陈述给我一个无效的标识符错误,我似乎不明白为什么?

4 个答案:

答案 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表之间的交集。这将使联接变得更加明智。