ใช้ SELECT ในส่วนคำสั่ง WHERE ของ SELECT อื่น


21

ผมได้ทำแอพลิเคชันระยะไกลร่างด้านบนของ libpq สำหรับPostrgreSQL มันทำงานได้ดี แต่ฉันได้ทำโปรไฟล์การทำงานทั่วไปของแอปพลิเคชัน สำหรับผลลัพธ์ทางธุรกิจแต่ละครั้งสุดท้ายที่ฉันผลิตมันเกิดขึ้นที่ฉันเรียกบางอย่างเช่น 40 ข้อเลือก (มากกว่า tcpip)

ฉันมีการเตือนความจำจาก SQL-Server เตือนให้ฉันลดจำนวนการโต้ตอบระหว่างแอปพลิเคชันระยะไกลและฐานข้อมูล จากการวิเคราะห์การเลือกของฉันฉันคิดว่าฉันสามารถลดจำนวนนี้เป็น 3 SELECTข้อโดยใช้การรวม แต่ผมจำไม่ได้ว่าไวยากรณ์สำหรับการใช้ผลของอีกSELECTSELECT

เช่น:

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'

สิ่งนี้SELECTจะเป็นสิ่งที่เรียบง่าย:

SELECT identifier FROM another_table WHERE something='something'

นี่คือเค้าโครงตารางที่เรียบง่ายปฏิเสธจำนวนครั้งสำหรับ item_types ที่แตกต่างกัน (3 ประเภทที่แตกต่างกันโดยสิ้นเชิงดังนั้นแบบสอบถาม SQL 3 รายการหากปรับให้เหมาะสม)

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

มีหลายอย่างใดอย่างหนึ่งid_item มีหลายอย่างใดอย่างหนึ่งid_passage
id_item_detailid_item

คุณจะเขียนมันอย่างไร
ชื่อสำหรับอธิบายการกระทำของการเปลี่ยนเส้นทางหนึ่งเลือกไปยังอีก (ถ้ามี) คืออะไร?



คุณหมายถึง 7.2.1.3 คำถามย่อย?
Stephane Rolland

อาจเป็นไปได้พร้อมกับส่วนเข้าร่วม
dezso

คำตอบ:


30

นี่คือสิ่งที่คุณตั้งเป้าหรือ ตรวจสอบให้แน่ใจว่ามีการเปรียบเทียบฟิลด์ที่เปรียบเทียบ (เช่นฟิลด์ทั้งสองเป็นตัวเลขข้อความบูลีน ฯลฯ )

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

หากคุณต้องการเลือกหลายค่า:

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

เป็นไปได้ไหม? มันจะยังใช้งานSELECT someID FROM table WHERE blahblahblahได้ถ้ามีหลายระเบียน? ฉันจะตรวจสอบตอนนี้
Stephane Rolland

แบบสอบถามใดเลือกหลายระเบียน สามารถทำงานได้หากคุณเลือกหลายระเบียน แต่หากคุณสามารถแสดงเค้าโครงตารางของคุณให้เราทราบซึ่งจะช่วยให้เราปรับแต่งคำตอบ
Angry Spartan

1
WHERE Individual.IndividualId IN...ดูดี.
Stephane Rolland

10

คุณสามารถเขียนมันอีกครั้งJOINได้ ปกติแล้วจะง่ายที่สุดและเร็วที่สุด:

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

ฉันยังทำให้มันง่ายขึ้นบ้างและใช้การสะกด CamelCase ที่ไม่มีตัวตน


1
ใช่สิ่งนี้ ฉันตายข้างในเล็กน้อยเมื่อใดก็ตามที่ฉันเห็นไวยากรณ์ IN (SELECT .. )
Mark Storey-Smith

@ MarkStorey-Smith คุณหมายถึงว่ามันง่ายกว่าและเร็วกว่า: นี่เป็นมาตรฐานของการเข้ารหัส sql ที่จะใช้รหัสอื่นjoinแทนที่จะเป็นแบบin ( select...)ในกรณีเช่นนี้ฉันควรให้คำตอบที่ดีกับเออร์วิน
Stephane Rolland

1
@StephaneRolland ไม่ว่าจะเร็วขึ้นหรือไม่นั้นจะขึ้นอยู่กับแพลตฟอร์มและเวอร์ชั่น ตัวอย่างเช่น SQL Server 2008+ จะสร้างแผนการดำเนินการที่เหมือนกันสำหรับไวยากรณ์ INNER JOIN และ IN (SELECT ... ) ไม่ทราบว่าจะใช้กับ PostgreSql หรือไม่ นอกเหนือจากการทำงานสไตล์ IN (SELECT ... ) ทำให้ฉันสงสัยว่าผู้เขียนเข้าใจความหมายและแนวคิดของ SQL อย่างเต็มที่หรือไม่ AngrySpartan ได้ตอบคำถามเดิมของคุณอย่างถูกต้อง ErwinBrandstetter แสดงวิธีที่คุณควรทำ :)
Mark Storey-Smith

6
@ MarkStorey-Smith: การเข้าร่วมอาจไม่เท่ากับเงื่อนไขในเสมอ คำถามนั้นไม่ใช่คำถามใดที่เร็วกว่าคำถามนี้เป็นคำถามที่ถูกต้อง
a_horse_with_no_name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.