Где пункт заявления повторяющихся данных - PullRequest
1 голос
/ 13 декабря 2010

У меня есть база данных, которая была заполнена некоторыми данными, используя create и insert в операторах.Я написал инструкцию SELECT, в которой есть предложение 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 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 ]

3 голосов
/ 13 декабря 2010

Ваше предложение WHERE кажется довольно слабым.Соединение Customer to Ord выглядит довольно сильным, но ItemOrdered даже не появляется в предложении WHERE, которое, вероятно, вызывает декартово соединение .

2 голосов
/ 13 декабря 2010

Глядя на ваши операторы создания здесь, я бы создал большинство соединений.Однако на таблицу 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';
1 голос
/ 13 декабря 2010

Кажется, что вы хотите выбрать что-то из таблиц Design и ItemOrdered, но вы не включили их в свое объединение.

Возможно, вам нужно расширить предложение where (с помощью операторов and), где вы связываете таблицы ItemOrdered и Design с вашими таблицами Customer или Customer_Contract.

0 голосов
/ 13 декабря 2010

В общем, если вы объединяете 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';

Обычно, однако, ваша модель данных будет иметь какую-то таблицу элементов,имеет внешний ключ к таблице Design, и таблица ItemOrdered будет пересечением между таблицами Item и Order.Это сделало бы соединения более разумными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...