Comment éviter le produit Cartésien dans une requête de JOINTURE INTERNE?
J'ai 6 tables, appelons-les a,b,c,d,e,f. Maintenant, je veux à la recherche de toutes les colonnes (à l'exception de la colonne d'ID) de toutes les tables pour un certain mot, disons 'Joe'. Ce que j'ai fait, j'ai fait des JOINTURES internes sur toutes les tables, puis utilisé COMME pour rechercher les colonnes.
INNER JOIN
...
ON
INNER JOIN
...
ON.......etc.
WHERE a.firstname
~* 'Joe'
OR a.lastname
~* 'Joe'
OR b.favorite_food
~* 'Joe'
OR c.job
~* 'Joe'.......etc.
Les résultats sont corrects, je reçois toutes les colonnes que je cherchais. Mais je reçois aussi une sorte de produit cartésien, je reçois 2 ou plus de lignes avec presque les mêmes résultats.
Comment puis-je éviter cela? Je veux donc avoir chaque ligne qu'une seule fois, car les résultats doivent apparaître sur une recherche sur le web.
Mise à JOUR
J'ai d'abord essayé de comprendre si la SELECT DISTINCT
chose serait de travailler à l'aide de cette déclaration: pastie.org/970959 Mais il me donne toujours un produit cartésien. Quel est le problème avec cela?
OriginalL'auteur flhe | 2010-05-20
Vous devez vous connecter pour publier un commentaire.
essayer
SELECT DISTINCT
?ms sql server a encore select distinct, n'est-ce pas?
Merci pour l'astuce.
Il semble qu'il n'y est distinct.
OriginalL'auteur chris
Sur ce que l'état ne vous
JOIN
cetables
? Avez-vous desforeign keys
ou quelque chose?Peut-être vous devriez trouver ce mot sur chaque table séparément?
OriginalL'auteur hgulyan
Quel type de serveur que vous utilisez? Microsoft SQL Server est un index de texte intégral fonctionnalité (je pense que les autres ont quelque chose comme cela aussi) qui vous permet de rechercher des mots clés dans beaucoup moins de ressources.
Également envisager d'utiliser de l'UNION au lieu de joindre les tables.
OriginalL'auteur molnarm
Sans voir vos tables, je ne peux vraiment assumer ce qui se passe ici est que vous avez un un-à-plusieurs relation de quelque part. Vous avez probablement envie de tout faire dans une sous-requête, sélectionnez l'distinctes Id, puis obtenir les données que vous souhaitez afficher par ID. Quelque chose comme:
Un couple de choses à noter, toutefois:
Cela va être sloooow et vous voudrez probablement utiliser la recherche de texte intégral à la place (si votre SGBDR prend en charge).
Il peut être plus rapide pour rechercher chaque table séparément plutôt que de joindre le tout à un produit Cartésien d'abord et ensuite le filtre avec les Rup.
Ok, je vais jeter un oeil à postgresql de recherche plein texte ensuite.
J'ai d'abord essayé de comprendre si le SELECT DISTINCT chose serait de travailler à l'aide de cette instruction: pastie.org/970959 Mais il me donne toujours un produit cartésien. Quel est le problème avec cela?
Jetez un oeil à vos Jointures - vous avez sans doute plusieurs enregistrements correspondants quelque part. Par exemple peut-être une des catégories de table ou quelque chose?
OriginalL'auteur lc.
Si vos tables sont de type entité tables, par exemple
a
être des personnes etb
être entreprises, je ne pense pas que vous pouvez éviter un produit cartésien si vous cherchez les résultats de cette façon (même requête).Vous dites que vous voulez la recherche de toutes les tables pour un mot en particulier, mais vous voudrez probablement pour séparer les résultats dans les types correspondants. Droit? Sinon, une recherche sur le web ne serait pas beaucoup de sens.
Donc, si vous recherche pour "Joe", vous voulez voir les personnes avec le nom "Jean" et, par exemple, la société nommé " Joe la salle de gym. Puisque vous êtes à la recherche pour les différentes entités de sorte que vous devez séparer la recherche dans les différentes requêtes.
Si vous voulez vraiment faire cela en une seule requête, vous devrez modifier votre base de données de la structure d'accueil. Vous aurez besoin d'une certaine forme de "table de recherche" contenant l'ID de l'entité (PK) et le type d'entité, et une liste de mots clés que vous souhaitez que cette entité à être trouvé avec les. Par exemple:
Quelque chose comme ça?
Cependant c'est différent lors de votre recherche ne renvoie qu'un seul type d'entité, dire d'une Personne, et que vous souhaitez renvoyer les Personnes pour qui vous obtenez un hit sur ce mot clé (dans n'importe quelle table liée à cette Personne). Ensuite, vous devez sélectionner tous les champs que vous souhaitez afficher et de groupe, en laissant de côté les domaines dans lesquels vous êtes à la recherche. Incluant inévitablement conduit à un produit cartésien.
Je suis juste de remue-méninges ici, par la manière. Il espère que c'est utile.
OriginalL'auteur pyrocumulus