SQL查询的两个与关系表一个一对多

问题描述:

我有两个表A和波段B A之间的关系是A --->一对许多--->乙SQL查询的两个与关系表一个一对多

通常情况下,我有对于A的每个记录B的一个记录

我想编写一个查询,这将使我的ONLY记录的其中有超过ONE(多)结果名单B.

我很困惑,因为我只做了基本的SQL查询,这对我来说似乎很复杂。

有人请指导我正确的答案或给我的解决方案。

编辑:

确定我想是这样的下方,它给我一个错误

SELECT SOME_COLUMN_NAME从一个,B b,其中a.ID = b.ID和计数(b.SOME_OTHER_COLUMN_NAME)> 1;

ORA-00934:组函数是不是在这里

我试图在互联网上的广告搜索允许我不允许使用WHERE子句中的分组,并应通过使用具有去。我现在被困在这里。

的数据库系统使用的是(SQL服务器/ MySQL的/ SQLite的/ ORACLE等)您还没有指定,所以这是一个通用的答案。

在这种形式中,在SELECT和GROUP BY子句中明确列出A的所有列。它通常在大多数数据库管理系统中生成一个很好的直接计划。但是如果类型不是GROUP-able,它也可能失败,比如SQL Server中的TEXT列。

SELECT A.Col1, A.Col2, A.Col3 
FROM A 
JOIN B ON A.LinkID = B.LinkID 
GROUP BY A.Col1, A.Col2, A.Col3 
HAVING COUNT(*) > 1 

使用子查询该另一形式适用于任何列类型A和通常产生完全相同的计划。

SELECT A.Col1, A.Col2, A.Col3 
FROM A 
WHERE 1 < (
    SELECT COUNT(*) 
    FROM B 
    WHERE A.LinkID = B.LinkID) 
+0

这在技术上是正确的,但是如果您在A中有很多列,它会变得非常混乱。如果您在结果中需要A中的所有列,那是只需按ID列进行分组,然后将A与子查询结合使用即可。 – 2012-02-23 20:21:54

你可以用一个子查询做到这一点:

select * 
    from A 
    where (select count(*) from B where B.id = A.id) > 1 
+0

这是可行的,但是你并不想就这样做在生产系统中使用大表。您在A中的每一行都有效地执行了子选择。 – 2012-02-23 20:27:39

select * 
from tableA 
where Id in (select IdA from tableb group by idA having COUNT(*)>1) 

假设tableB的有一个叫做艾达场,它链接到TABLEA