我是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?
任何想法?
答案 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
这意味着您的查询行数必须小于或等于表计数。
因此,这留下了以下可能性......
尝试在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
我希望这有助于您理解!