SQL Simple Inner Join - PullRequest
       6

SQL Simple Inner Join

0 голосов
/ 05 октября 2011

Я нуб в SQL.

Ive 3 таблицы:

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)
}

ТАБЛИЦА "TB_ITEM" ИМЕЕТ 416 ЗАПИСЕЙ.

Я пробовал, следуйте запросу:

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

и результат: 1162 результатов

Я имею в виду: я хочу получить только те 416 записей из TB_ITEM и его ИМЯ КАТЕГОРИЙ и ИМЕНА ПОДКАТЕГОРИЙ из TB_ITEM_CAT и TB_ITEM_SUBCAT

Является ли этот запрос неправильным? Почему 1162 записи вместо 416?

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 05 октября 2011

Ваш TB_ITEM имеет два FK

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)

И ваши соединения совпадают

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

Это означает, что количество строк в вашем запросе должно быть меньше или равно количеству таблиц.

Таким образом, это оставляет следующие возможности ...

  1. Ваш счет в таблице неверен
  2. Объединения в вашем запросе как опубликованные не соответствуют тому, что вы пытаетесь
  3. В вашем соединении есть что-то еще, чего мы не видим
  4. Вы не ссылаетесь на объект, который считаете своим. (возможно, представление или синоним)
  5. Или ваш первичный или внешний ключ - это не то, что вы говорите. например ваш ключ является составным ключом

Попробуйте добавить имена схем, например dbo.TB_ITEM, в свои таблицы в предложении from и перепроверить остальные.

2 голосов
/ 05 октября 2011

Вам необходимо убедиться, что TB_ITEM_SUBCAT правильно соединен, чтобы избежать дублирования

Проверьте, работает ли это:

 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
1 голос
/ 05 октября 2011

Происходит то, что в результатах создается запись для каждого случая, когда элемент соответствует категории / подкатегории.Так, например, если элемент A имеет 3 категории, к которым он принадлежит, результаты будут включать 3 экземпляра элемента A, соответствующих каждой из этих категорий.Естественно, это осложняется таблицей подкатегорий, а также присоединяется к ней.Если у элемента было 3 категории и 2 подкатегории, которые возвращали бы 6 результатов!

Если вам не важно, какую категорию и / или подкатегорию вы выбрали для определенного элемента, вы можете просто сделать что-то вроде этого:

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

Также, если вы просто хотите получить один экземпляр каждого элемента и разделенный запятыми список категорий, подкатегорий, я думаю, что-то вроде этого должно работать:

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

Iнадеюсь, это поможет вам понять!

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