2013-06-12 10 views
5

Bir WHERE yan tümcesinde birden çok kez kullanılan aynı alt sorgu içeren bir sorguyu çalıştırıyorum.Tek bir sorguda birden çok kez kullanılan aynı alt sorgu

client_id, buyer_id numaralı römork alanları olan bir tablom var.

Alt sorgu, sonuçtan çıkarılacak tarihlerin listesini döndürür.

Bunu nasıl kullanıyorum.

SELECT 
    id, client_id, buyer_id 
FROM relation 
WHERE 
    client_id NOT IN (SELECT <some_id> FROM <some_table> WHERE ...) 
    AND buyer_id NOT IN (SELECT <some_ids> FROM <some_table> WHERE ...) 

Bu, beklendiği gibi çalışıyor, ancak beni iki alt sorgusu olduğundan rahatsız ediyor. Bir kere kullanabileceğim bir yol olup olmadığını ve sonuçların her iki yer için de kullanıldığını merak ediyorum.

Teşekkürler. Formun

+0

Bir JOIN ile bu alt sorgu yerine denedin mi? – Taryn

+0

@bluefeet, Bu soruyu size gerçek problemi vermek için uzun bir yolla basitleştirdim. Ayrıca JOIN'nin ON 'deyiminin nasıl görüneceğini anlayamıyorum. –

cevap

3

Sen NOT EXISTS kullanarak bu yazabilirsiniz:

SELECT 
    id, client_id, buyer_id 
FROM relation AS r 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM <some_table> 
     WHERE (r.client_id = <some_id> OR r.buyer_id = <some_id>) 
      AND ... 
    ) ; 
+0

Ben benzer bir sorgu '' alan korelasyonu istisna hata alıyorum. – serdar

1

Sorgular:

select ... 
from <main query> 
where <select field> not in (select <subquery field> from <subquery>) 

normalde olarak yeniden formüle edilebilir: Kullandığınız alt sorgu client_id ve buyer_id ikisi için tam aynıysa

select <main query fields> 
from <main query> 
left join <subquery> on <select field> = <subquery field> 
where <subquery field> is null 

, bu Bu nedenle sorgunuzu yeniden formüle etmek mümkün olmalıdır:

SELECT id, client_id, buyer_id 
FROM relation 
LEFT JOIN <some_table> ON <some_id> IN (client_id, buyer_id) 
WHERE <some_id> IS NULL 

- bu nedenle alt sorguyu sorguda yalnızca bir kez etkin olarak kullanır.

+0

Birleşim içeren bir çözüm, bir alt sorgu ile bir çözüm olarak aynı sonucu döndürmeyebilir. –

+0

Tam olarak ne yaşadığımı. Aynı satır, daha fazla satır döndürmüyor. Ayrıca ekstra zaman ayırın. Özgün sorgum 41 saniyede çalışıyor ve JOIN'de kullandığında 61 saniye sürdü. –

+1

@TalhaAhmedKhan Bazı verilerle [SQL-Fiddle] (http://sqlfiddle.com/) sağlayabilir misiniz? Bu sorgunun sahip olduğunuzla eşdeğer olduğunu düşünüyorum (eğer 'client_id' ve 'buyer_id' sütunları null olamazsa.) –

0

Sorgunuzda şöyle dönüştürülebilirdi:

SELECT 
    id, client_id, buyer_id 
FROM relation 
LEFT JOIN some_table 
) AS subquery ON (subquery.some_id IN (client_id, buyer_id) AND <condition that was in your subquery>) 
WHERE subquery.some_id IS NULL; 

Ama bu hala yürütme zaman açısından çok düşük performansla çalışacaktır his var.

Alt sorgunuzun içeriğini tutan geçici bir tablo oluşturmayı düşünün.

0

Alınan değerleri ayrı bir veritabanı tablosuna koymaya çalışmak, böylece sonuçların ayrı bir tabloda zaten olması durumunda benzer sonuç değerleri veya farklı olup olmadığına karar vermenizde yardımcı olabilir. İşlemlerden haber bekliyorum ... İyi şanslar pls.