SQL:如何按不同表中的列进行过滤?

时间:2016-10-27 12:37:49

标签: sql

假设我们有一些我们想要查询的表A,它通过一对多关系与另一个表B相关,因此,A可以有几个B对象,而每个B对象只能有一个A宾语。问题是,在查询A时,我需要按表B上的列进行筛选。这样做的最佳方法是什么?

如果我使用JOIN,那么我最终会在结果中重复A行。它是合乎逻辑的,因为A对象可以有许多B对象。在MySQL中,我可以通过使用GROUP BY来避免重复,但这在其他数据库系统上是不可能的,它们会强制您使用聚合函数。

如果我使用子查询,那么我认为性能不好,因为最嵌套的子查询可能会返回非常多的行:

SELECT * FROM A WHERE ID IN (SELECT A_ID FROM B WHERE B.some_column = 'my-filter');

那个子查询看起来很糟糕,如果B有大量行,就时间/性能来说可能会很痛苦。

* A_ID是此示例中的外键,它指向表A中的ID字段。

那么,这样做的好方法是什么?

2 个答案:

答案 0 :(得分:2)

使用联接和不同的

selct distinct A.*
from A
inner join B
    on B.ID = A.ID
where B.ColumnB = 'Filter'

答案 1 :(得分:1)

其他数据库系统上的GROUP BY没有问题!它们只是强迫你在GROUP BY子句中用聚合函数编写整列,因为它应该是,而不是允许这个愚蠢的东西的MySQL。所以:

SELECT a.Col1,a.Col2,a.Col3...
FROM A
JOIN B
 ON(a.id = b.id)
WHERE B.some_column = 'my-filter'
GROUP BY a.Col1,a.Col2,a.Col3...