在同一个表中多次使用内部联接返回SQL Server行数
我有这个密码在同一个表中多次使用内部联接返回SQL Server行数,sql,sql-server,count,Sql,Sql Server,Count,我有这个密码 select count(cat_item_tb.item_id), count(t.item_id) from cat_tb inner join item_tb on cat_tb.cat_id = item_tb.cat_id inner join cat_item_tb on item_tb.item_id = cat_item_tb.item_id and t.ss = 0 inner join cat_item_t
select
count(cat_item_tb.item_id),
count(t.item_id)
from
cat_tb
inner join
item_tb on cat_tb.cat_id = item_tb.cat_id
inner join
cat_item_tb on item_tb.item_id = cat_item_tb.item_id and t.ss = 0
inner join
cat_item_tb t on item_tb.item_id = t.item_id and t.ss = 1
所有我需要返回的值没有重复。在过去的代码中,每次计数必须返回7,但返回49。这两个count()
相互影响。我使用distinct,但它不会返回正确的计数,因为表中有(item_id)多次
非常感谢如果我正确理解了任务,您可以使用groub by获得所需的结果
select count(cat_item_tb.item_id), cat_item_tb.ss
from cat_tb
inner join item_tb on cat_tb.cat_id = item_tb.cat_id
inner join cat_item_tb on item_tb.item_id = cat_item_tb.item_id
where t.ss = 0 or t.ss = 1
group by cat_item_tb.ss
查询将返回两行,第一列包含计数值。关于分组依据的更多信息在这里在我看来,您需要计算不同的值,以计算唯一的值
...
count(DISTINCT cat_item_tb.item_id)
...
查询中的两个计数将相同。这仅仅是因为您在这些项目的id上进行了内部连接。因此,它们在防御上是相同的。我相信你想写一些类似于:
select
count(c1.item_id),
count(c2.item_id)
from
cat_tb as a
inner join item_tb as b on ( a.cat_id = b.cat_id )
inner join cat_item_tb as c1 on ( b.item_id = c1.item_id ) and ( c1.ss = 0 )
inner join cat_item_tb as c2 on ( b.item_id = c2.item_id ) and ( c2.ss = 1 )
由于内部联接,这将不起作用。如果c1的第一个连接返回3行,c2的第二个连接返回4行,那么最终的结果是count=3*4
试试这个:
;with cte1 as (
select
b.item_id,
'c1_count' = count( c1.item_id )
from
item_tb as b
left join cat_item_tb as c1 on ( b.item_id = c1.item_id ) and ( c1.ss = 0 )
group by
b.item_id
),
cte2 as (
select
b.item_id,
'c2_count' = count(c2.item_id)
from
item_tb as b
left join cat_item_tb as c2 on ( b.item_id = c2.item_id ) and ( c2.ss = 1 )
group by
b.item_id
)
select
a.item_id, a.c1_count, b.c2_count
from
cte1 as a
inner join cte2 as b on ( b.item_id = a.item_id )
出于性能原因,如果您确定
目录中的项目tb
中有行具有项目id,并且所有行都将ss
列设置为0或1,则可以将CTE中的左联接
替换为内部联接
示例和所需的结果将非常有用。当连接两侧有多个值相同的行时,这是意料之中的。因此,这是您的数据,而不是查询。请注意7*7=49;-)