2010-03-10 52 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

相關問題