不太确定怎么问这个,但我有2个表在1对多关系中相关,我需要在“1”表中选择“many”表中少于3个记录的所有记录
select b.foreignkey,count(b.foreignkey) as bidcount
from b
where b.foreignkey in (select a.id from a) and bidcount< 3
group by b.foreignkey
这根本不起作用我知道,但我不知道怎么做。
我最终需要根据此条件从“a”表中选择所有记录。对不起,如果那令人困惑!
答案 0 :(得分:2)
试试这个:
SELECT t1.id,COUNT(t2.parentId)
FROM table1 as t1
INNER JOIN table2 as t2
ON t1.id = t2.parentId
GROUP BY t1.id
HAVING COUNT(t2.parentId) < 3
答案 1 :(得分:2)
只使用您的代码,未经过测试:
SELECT
b.foreignkey,
count(b.foreignkey) as bidcount
FROM
b
WHERE
b.foreignkey IN (SELECT a.id FROM a)
GROUP BY
b.foreignkey
HAVING
count(b.foreignkey) < 3
答案 2 :(得分:0)
您没有提及您正在使用的SQL Server版本 - 如果您使用的是SQL Server 2005或更高版本,则可以使用此CTE(公用表表达式):
;WITH ChildRows AS
(
SELECT A.Id, COUNT(b.Id) AS 'BCount'
FROM
dbo.TableA A
INNER JOIN
dbo.TableB B ON B.TableAId = A.Id
)
SELECT A.*, R.BCount
FROM dbo.TableA A
INNER JOIN ChildRows R ON A.Id = R.Id
内部SELECT
列出Id
中的TableA
列以及与这些列相关联的子行数(使用INNER JOIN
到TableB
) - 外部SELECT
只是建立在该结果集之上,并显示表A中的所有字段(以及B表中的计数)
答案 3 :(得分:0)
如果你想在一个查询中返回你(1)表的所有字段,我建议你考虑使用CROSS APPLY:
SELECT t1.* FROM table_1 t1
CROSS APPLY (SELECT COUNT(*) cnt FROM Table_Many t2 WHERE t2.fk = t1.pk) a
where a.cnt < 3
在某些特定情况下,根据您的索引和数据库结构,此查询的运行速度可能比GROUP BY
方法快4倍
答案 4 :(得分:0)
你已经在sql server中发布了这个问题,我在oracle数据库系统中有一个答案(不知道它是否也会在sql server中运行)
这是如下 -
select [desired column list] from
(select b.*, count(*) over (partition by b.foreignkey) c_1
from b
where b.foreignkey in (select a.id from a) )
where c_1 < 3 ;
我希望它也适用于sql server ... 如果没有请让我更新..