SQL简单内部联接

时间:2011-10-04 21:33:17

标签: sql inner-join

我是SQL中的Noob。

我有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结果

我的意思是:我只想从TB_ITEM及其类别名称和子类别名称中检索那416条记录 来自TB_ITEM_CAT和TB_ITEM_SUBCAT

这个查询错了吗?为什么1162条记录只改为416?

任何想法?

3 个答案:

答案 0 :(得分:3)

您的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. 或者您的主键或外键不是您所说的。例如你的密钥是一个复合密钥
  6. 尝试在from子句中向表中添加模式名称,例如dbo.TB_ITEM,然后重新检查其他名称。

答案 1 :(得分:2)

您需要确保正确连接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

答案 2 :(得分:1)

正在发生的事情是,在结果中,每次项目与类别/子类别匹配时,它都会创建记录。因此,例如,如果项目A具有它所属的3个类别,则结果将包括项目A的3个实例,匹配每个类别。当然,这也是子类别表的复合,并加入了这一点。如果一个项目有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

我希望这有助于您理解!