【问题标题】:Where Clause Statement Repeating DataWhere 子句语句重复数据
【发布时间】:2010-12-14 01:06:54
【问题描述】:

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

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您的 WHERE 子句似乎相当宽松。 Customer to Ord 连接似乎非常强大,但 ItemOrdered 甚至没有出现在 WHERE 子句中,这可能导致Cartesian Join

    【讨论】:

    • 您是否建议将 ItemOrdered 包含在 WHERE 子句中?
    【解决方案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';
    

    【讨论】:

      【解决方案3】:

      您似乎想从 Design 和 ItemOrdered 表中选择一些东西,但您没有将它们包括在您的联接中。

      您可能需要扩展 where 子句(使用 and 语句),将 ItemOrdered 和 Design 表链接到 Customer 或 Customer_Contract 表。

      【讨论】:

      • 我扩展了 where 子句,使其看起来像上面那样。我已经编辑了这些字段。
      • user532339:连接的设计表呢?该键在任何其他表中都不作为外键存在。
      • 设计表已连接。它与 BeltID 连接,以下链接显示了它们是如何连接的。 pastebin.com/rrCr9M46
      【解决方案4】:

      一般来说,如果要将 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 表之间的交集。这将使联接更加明智。

      【讨论】:

      • 我明白你在说什么,但我的加入和你的加入做同样的事情。我仍然遇到这个问题。以下链接显示了不断发生的问题imgur.com/UjrbC
      • 您是否有机会编辑您的问题以包含您链接到的信息?我无法从防火墙后面访问该 URL。
      • 我有一个 DesignID,它是 BeltID 表中的外键,我有以下语句结构。但给出 ORA-00904: "BELTID"."DESIGNID": invalid identifier。当我在我的声明中指出它时,它究竟是无效的?
      • 我接受了你对事物的理解并对其进行了调整。但是我似乎得到了同一件事的三个重复记录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      相关资源
      最近更新 更多