2011-10-04 7 views
0

Je suis Noob en SQL.SQL Simple Inner Join

Ive 3 tables:

TB_ITEM 
{ 
    TB_ITEM_ID int primary key, 
    TB_ITEM_CAT_ID int, 
    TB_ITEM_SUBCAT_ID int, 
    TB_ITEM_NAME varchar(350) 
    add constraint FK_ITEM_CAT foreign key(TB_ITEM_CAT_ID) 
    references TB_ITEM_CAT(TB_ITEM_CAT_ID), 
    add constraint FK_ITEM_SUBCAT foreign key(TB_ITEM_SUBCAT_ID) 
    references TB_ITEM_SUBCAT(TB_ITEM_SUBCAT_ID) 
} 
TB_ITEM_CAT 
{ 
    TB_ITEM_CAT_ID int primary key, 
    TB_ITEM_CAT_NAME varchar(350) 
} 
TB_ITEM_SUBCAT 
{ 
    TB_ITEM_SUBCAT_ID int primary key, 
    TB_ITEM_CAT_ID int, 
    TB_ITEM_SUBCAT_NAME 
    add constraint FK_CAT foreign key(TB_ITEM_CAT_ID) 
    references TB_ITEM_CAT(TB_ITEM_CAT_ID) 
} 

TABLE "TB_ITEM" HAS 416 RECORDS.

Ive a essayé, suivre la requête:

select a.TB_ITEM_NAME, b.TB_ITEM_CAT_NAME, c.TB_ITEM_SUBCAT_NAME from 
TB_ITEM a inner join 
TB_ITEM_CAT b on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 
    inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID 

et le résultat est: 1162 résultats

Je veux dire: Je veux récupérer uniquement les 416 dossiers de TB_ITEM et ses CATÉGORIES NOMS ET SOUS-CATÉGORIES NOM à partir de TB_ITEM_CAT et TB_ITEM_SUBCAT

Cette requête est-elle incorrecte Pourquoi 1162 enregistrements à la place seulement 416?

Un idéias?

+0

S'il y a plusieurs lignes de 'TB_ITEM' qui ont la même entrée pour' TB_ITEM_SUBCAT_ID', alors elles vont correspondre plusieurs fois avec la colonne du même nom dans 'TB_ITEM_SUBCAT_NAME'. En un coup d'œil, c'est probablement le problème. –

+0

Essayez d'ajouter un 'group by 1,2,3' à la fin de votre requête. Le problème pourrait être que vous avez des lignes en double. –

+0

avec group by, le nombre de résultats est de 1152. -10 – ozsenegal

Répondre

2

Vous devez vous assurer que TB_ITEM_SUBCAT est joint correctement pour éviter les doublons

Voir si cela fonctionne:

select a.TB_ITEM_NAME, b.TB_ITEM_CAT_NAME, c.TB_ITEM_SUBCAT_NAME from 
TB_ITEM a inner join 
TB_ITEM_CAT b on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 
inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID and a.TB_ITEM_CAT_ID = c.TB_ITEM_CAT_ID 
+0

WOW! Maintenant ça marche! Je veux dire, quel était le problème? Pouvez-vous expliquer? – ozsenegal

+0

J'ai remarqué que la table TB_ITEM_SUBCAT contient une clé étrangère à la table TB_ITEM_CAT, ce qui m'a amené à penser que TB_ITEM_SUBCAT_ID n'est peut-être pas la clé primaire de la table. La clé primaire est probablement une combinaison de TB_ITEM_CAT_ID et de TB_ITEM_SUBCAT_ID. Donc la jointure de TB_ITEM devrait vérifier l'égalité aux deux colonnes. Vous pouvez probablement vérifier cela en regardant les données dans la table TB_ITEM_SUBCAT. –

3

Votre TB_ITEM a deux FKs

add constraint FK_ITEM_CAT foreign key(TB_ITEM_CAT_ID) 
    references TB_ITEM_CAT(TB_ITEM_CAT_ID) 

add constraint FK_ITEM_SUBCAT foreign key(TB_ITEM_SUBCAT_ID) 
    references TB_ITEM_SUBCAT(TB_ITEM_SUBCAT_ID) 

Et votre rejoignant le match

from 
TB_ITEM a inner join 
inner join TB_ITEM_CAT b 
on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 

inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID 

Cela signifie que votre requête rowcount doit être inférieure ou égale au nombre de tables.

Donc cela laisse les possiblités suivantes ...

  1. Votre compte du tableau est incorrect
  2. Le joint dans votre requête telle que publiée ne correspond pas à ce que vous essayez
  3. Vous avez quelque chose d'autre dans votre jointure que nous ne voyons pas
  4. Vous ne faites pas référence à l'objet que vous pensez être. (peut-être une vue ou un synonyme)
  5. Ou votre clé primaire ou clé étrangère n'est pas ce que vous dites qu'ils sont. par exemple. votre clé est une clé composite

Essayez d'ajouter des noms de schéma, par exemple, dbo.TB_ITEM à vos tables dans la clause from et de revérifier les autres.

+0

non, je ne pense pas.La réponse ci-dessous travailler pour moi – ozsenegal

+0

Je suis heureux que vous ayez résolu votre problème. J'ai mis à jour ma réponse pour inclure l'autre possibilité que vous ce que vous avez posté sur les clés n'était pas exacte (comme Rajeev était capable de comprendre). Je laisse cette réponse pour la possibilité que cela puisse aider quelqu'un dans le futur. Aussi, en aparté, vous voulez probablement référencer les réponses par l'affiche plutôt que «au-dessus» ou «au-dessous» puisque la position peut changer. –

1

Ce qui se passe, c'est que dans les résultats, il crée un enregistrement pour chaque fois qu'un élément correspond à une catégorie/sous-catégorie. Ainsi, par exemple, si l'élément A a 3 catégories auxquelles il appartient, les résultats incluront 3 occurrences de l'élément A, correspondant à chacune de ces catégories. Naturellement, ceci est aggravé par la table des sous-catégories, et rejoint cela aussi. Si un article avait 3 catégories et 2 sous-catégories qui retourneraient 6 résultats!

Si vous ne se soucient pas de quelle catégorie et/ou sous-catégorie que vous sélectionnez pour un élément particulier, vous pouvez simplement faire quelque chose comme ceci:

select a.TB_ITEM_NAME, b.TB_ITEM_CAT_NAME, c.TB_ITEM_SUBCAT_NAME from 
TB_ITEM a inner join 
TB_ITEM_CAT b on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 
    inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID 
GROUP BY a.TB_ITEM_ID 

Aussi, si vous voulez juste une seule instance de chaque élément et une liste séparée par des virgules des catégories, sous-catégories, je pense que quelque chose comme cela devrait fonctionner:

select a.TB_ITEM_NAME, GROUP_CONCAT(b.TB_ITEM_CAT_NAME), GROUP_CONCAT(c.TB_ITEM_SUBCAT_NAME) from 
TB_ITEM a inner join 
TB_ITEM_CAT b on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 
    inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID 
GROUP BY a.TB_ITEM_ID 

J'espère que cela vous aide à comprendre!