如何从SQL Server中相关表中具有特定行数的表中选择记录?

时间:2011-06-20 18:09:57

标签: sql sql-server

不太确定怎么问这个,但我有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”表中选择所有记录。对不起,如果那令人困惑!

5 个答案:

答案 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 JOINTableB) - 外部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 ... 如果没有请让我更新..