2010-03-10 77 views
1

我有两个表A和B,其中存在一对多关系。查询表查找ANSI SQL中是否存在子表的匹配记录

现在我想从A存在一些记录,并且这个存在字段显示B是否有任何匹配的记录。我不想使用count函数,因为B有太多延迟SQL执行的记录。要么我不想使用像下面这样的Oracle的rownum等专有关键字,因为我需要尽可能多的兼容性。

select A.*, (
    select 1 from B where ref_column = A.ref_column and rownum = 1 
) existence 
... 

回答

0

使用EXISTS子句。如果B中的外键被索引,性能不应该成为问题。

SELECT * 
FROM a 
WHERE EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id) 
+0

您的代码不返回的记录不具有B. – DylanYi 2010-03-10 09:27:55

1

无论如何,您将使用左连接+计数,选择​​列表中的select语句可以多次执行,而连接只能执行一次。

您也可以考虑存在:

select A.*, case when exists (
    select 1 from B where ref_column = A.ref_column and rownum = 1 
) then 1 else 0 end 
+0

+1匹配的记录:我的名字(别名)添加到该列。 我不认为'rownum'是ANSI SQL。在SQL Server中,它将是“SELECT TOP 1”,而在MySQL中它将是“LIMIT 1”。 为了实现'ANSI SQL'的实现,需要'LEFT JOIN',其中'COUNT(*)'将被替换为'CASE WHEN COUNT(*)...' – van 2010-03-10 09:44:56

相关问题