SELECT kullanarak, başka bir SELECT’nin WHERE yan tümcesinde


21

PostrgreSQL için libpq üzerine bir taslak uzak uygulama yaptım . İyi davranıyor, ancak uygulamanın genel işleyişini profilledim. Ürettiğim her son iş sonucu için, 40 seçim maddesi (tcpip üzerinden) gibi bir şey çağırdım.

Uzak uygulamam ve veritabanı arasındaki etkileşimin sayısını en aza indirgememi hatırlattığım SQL-Server'dan haberi var. Seçimlerimi analiz ettikten sonra, bu sayıyı SELECTbirleştirme kullanarak 3 cümleyi azaltabileceğimi düşünüyorum . Ama ben SELECTiçinde başka bir sonucu kullanmak için sözdizimi hatırlamıyorum SELECT.

Örneğin:

SELECT * FROM individual
INNER JOIN publisher
ON individual.individual_id = publisher.individual_id
WHERE individual.individual_id = 'here I would like to use the results of a another select'

Bu diğer SELECTbasitçe böyle olurdu:

SELECT identifier FROM another_table WHERE something='something'

İşte basitleştirilmiş tablo düzeni, farklı item_types için bir kaç kez reddetti ... (3 tamamen farklı tip, dolayısıyla optimize edilmişse 3 SQL sorgusu).

table passage
  id_passage PK
  business_field_passage bytea

table item
  id_item PK
  id_passage FK
  business_field_item text

table item_detail
  id_item_detail PK
  id_item FK
  business_field_item_detail text
  image_content bytea

Biri için birkaç id_itemtane var id_passage.
Biri için birkaç id_item_detailtane var id_item.

Bunu nasıl yazarsın?
Bir seçimi diğerine (eğer varsa) yönlendirme eylemini tanımlamanın adı nedir?



7.2.1.3'e mi bakıyorsunuz? Alt sorgular?
Stephane Rolland

Muhtemelen evet, JOIN kısmı ile birlikte.
dezso

Yanıtlar:


30

Amacınız bu mu? Karşılaştırılan alanların karşılaştırılabilir olduğundan emin olun (yani her iki alan da sayısal, metin, boolean, vb.).

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId = (SELECT someID FROM table WHERE blahblahblah)

Birden fazla değere dayalı seçmek istiyorsanız:

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId IN (SELECT someID FROM table WHERE blahblahblah)

o düz ileri olabilir mi? SELECT someID FROM table WHERE blahblahblahBirden fazla kayıt varsa hala çalışıyor mu? Bunu şimdi kontrol edeceğim.
Stephane Rolland

Hangi sorgu birden fazla kayıt seçiyor? Birden fazla kayıt seçiyorsanız işe yarar, ancak bize cevap düzenini düzeltmemize yardımcı olacak tablo düzenlerinizi gösterebilirseniz.
Angry Spartan

1
WHERE Individual.IndividualId IN...iyi görünüyor.
Stephane Rolland

10

Bunu başka biri olarak yeniden yazabilirsin JOIN. Bu normalde en basit ve en hızlıdır:

SELECT i.*, p.*
FROM   individual    i
JOIN   publisher     p USING (individualid)
JOIN   another_table a ON a.identifier = i.individualid
WHERE  a.something = 'something'

Ben de biraz sadeleştirdim ve tanımlayıcıların huysuz CamelCase hecelemesini yaptım.


1
Evet bu. IN (SELECT ..) sözdizimini gördüğümde biraz içeride ölüyorum.
Mark Storey-Smith,

@ MarkStorey-Smith Daha basit ve daha hızlı olduğunu mu kastediyorsunuz: Bu bir joinyerine bir tane kullanmak için bir sql kodlama standardıdır. in ( select...)Böyle bir durumda da Erwin'e iyi bir cevap vermem gerekir.
Stephane Rolland

1
@StephaneRolland Daha hızlı olup olmamasına, platform ve versiyona bağlı olacaktır. Örneğin SQL Server 2008+, INNER JOIN ve IN (SELECT ...) sözdizimi için aynı yürütme planlarını üretecektir. PostgreSql için de aynı şeyin geçerli olup olmadığı konusunda hiçbir fikriniz yok Performans bir yana, IN (SELECT ...) tarzı yazarın SQL'in anlamını ve kavramlarını tam olarak kavrayıp anlamadığını merak etmemi sağlıyor. AngrySpartan orijinal sorunuzu doğru cevapladı. ErwinBrandstetter size bunu nasıl yapmanız gerektiğini gösterdi :).
Mark Storey-Smith

6
@ MarkStorey-Smith: Bir JOIN her zaman bir IN koşuluna eşdeğer değildir. Soru hangisinin daha hızlı olmadığı, soru hangisinin doğru olduğu.
a_horse_with_no_name
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.