2010-12-13 27 views
1

J'ai une base de données qui a été remplie avec des données en utilisant create et insert into statements. J'ai écrit une instruction SELECT qui a une clause WHERE. Le problème que je rencontre est que lorsque je lance la déclaration, j'ai constaté que certaines des données se répètent pour quelle raison je ne comprends pas.Où clause déclaration Répétition des données

Ceci est l'instruction que j'essaie de lancer.

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'; 

Le lien suivant affiche tout le code pertinent, que j'ai utilisé pour créer l'instruction ci-dessus. [Code de base de données] [1]

Je l'ai tracée dans le format suivant:

CREATE STATEMENT 
INSERT INTO STATEMENT 

élargi clause Where et ressemble à ce qui suit:

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'; 

Cela fonctionne, mais quand je exécuter la déclaration, il apporte 3 enregistrements qui sont exactement les mêmes. L'instruction ci-dessus me donne une erreur d'identificateur invalide, ce que je ne semble pas comprendre. Pourquoi?

Répondre

1

Il semble que vous souhaitiez sélectionner quelque chose dans les tables Design et ItemOrdered, mais vous ne les incluez pas dans votre jointure.

Vous devez probablement développer votre clause where (avec et-statements), où vous liez les tables ItemOrdered et Design à vos tables Customer ou Customer_Contract.

+0

J'ai développé ma clause where pour que cela ressemble à ce qui précède. J'ai édité les champs. –

+0

user532339: Qu'en est-il de la table de conception jointe? La clé n'existe pas en tant que clé étrangère dans une autre table. –

+0

La table de conception est jointe. Il est joint à la BeltID le lien suivant montre comment ils sont joints. http://pastebin.com/rrCr9M46 –

3

Votre clause WHERE semble plutôt laxiste. La jointure Customer to Ord semble assez forte, mais ItemOrdered n'apparaît même pas dans la clause WHERE, ce qui provoque probablement un Cartesian Join.

+0

Suggérerais-tu d'inclure le ItemOrdered dans la clause WHERE? –

2

En regardant vos instructions create voici comment je créerais la plupart des jointures. La table design ne semble toutefois pas être référencé par l'une des autres tables si on aurait besoin plus d'informations pour compléter la requête

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'; 
0

En général, si vous joignez des tables de N ensemble, vous voulez fournir à au moins N-1 conditions de jointure. Puisque vous rejoignez 4 tables, vous devez normalement avoir au moins 3 conditions de jointure. Si l'intention est que la colonne DesignStyle soit unique (ce qui n'est pas clair à partir du DDL auquel vous avez lié), cela devrait fonctionner.

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'; 

Normalement, cependant, votre modèle de données aurait une sorte de table Item qui avait une clé étrangère à la table design et la table ItemOrdered serait une intersection entre les tables de l'objet et l'ordre. Cela rendrait les jointures beaucoup plus sensées.

+0

Je comprends ce que vous dites mais ma jointure et votre jointure font la même chose. Je rencontre toujours ce problème. Ce lien suivant affiche le problème qui persiste http: // imgur.com/UjrbC –

+0

Avez-vous une chance de modifier votre question pour inclure les informations que vous liez? Je ne peux pas accéder à cette URL depuis mon pare-feu. –

+0

J'ai un DesignID qui est une clé étrangère dans une table BeltID, j'ai la déclaration suivante structurée. Mais donne ORA-00904: "BELTID". "DESIGNID": identificateur invalide. En quoi est-ce invalide quand je l'ai identifié dans la déclaration? –