Sử dụng CHỌN trong mệnh đề WHERE của một CHỌN khác


21

Tôi đã thực hiện một dự thảo ứng dụng từ xa trên libpq cho PostrgreSQL . Nó hoạt động tốt, nhưng tôi đã mô tả chức năng chung của ứng dụng. Đối với mỗi kết quả kinh doanh cuối cùng mà tôi tạo ra, điều đó xảy ra khi tôi gọi một cái gì đó giống như mệnh đề 40 select (trên tcpip).

Tôi có các hồi ức từ SQL-Server nhắc nhở tôi giảm thiểu số lượng tương tác giữa ứng dụng từ xa và cơ sở dữ liệu. Sau khi phân tích các lựa chọn của tôi, tôi nghĩ rằng tôi có thể giảm con số này xuống còn 3 SELECTmệnh đề, sử dụng các phép nối. Nhưng tôi không nhớ cú pháp sử dụng kết quả của cái SELECTkhác SELECT.

Ví dụ:

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'

Điều này SELECTsẽ chỉ đơn giản là loại:

SELECT identifier FROM another_table WHERE something='something'

Dưới đây là cách bố trí các bảng được đơn giản hóa, đã từ chối một số lần cho các item_types khác nhau ... (3 loại hoàn toàn khác nhau, do đó 3 truy vấn SQL nếu được tối ưu hóa).

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

Có một số id_itemcho một id_passage.
Có một vài id_item_detailcho mộtid_item .

Làm thế nào bạn sẽ viết điều đó?
Tên để mô tả hành động chuyển hướng một lựa chọn sang một lựa chọn khác (nếu có) là gì?



bạn đang đề cập đến 7.2.1.3. Truy vấn con?
Stephane Rolland

Có thể có, cùng với phần THAM GIA.
dezso

Câu trả lời:


30

Đây có phải là những gì bạn đang hướng tới? Đảm bảo các trường đang được so sánh là tương đương (nghĩa là cả hai trường là số, văn bản, boolean, v.v.).

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

Nếu bạn muốn chọn dựa trên nhiều giá trị:

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

nó có thể là thẳng về phía trước ?? Nó vẫn hoạt động nếu SELECT someID FROM table WHERE blahblahblahcó nhiều hồ sơ? Tôi sẽ kiểm tra nó ngay bây giờ.
Stephane Rolland

Truy vấn nào đang chọn nhiều bản ghi? Nó có thể hoạt động nếu bạn đang chọn nhiều bản ghi, nhưng nếu bạn có thể chỉ cho chúng tôi bố trí bảng của bạn sẽ giúp chúng tôi tinh chỉnh câu trả lời.
Angry Spartan

1
WHERE Individual.IndividualId IN...có vẻ tốt
Stephane Rolland

10

Bạn chỉ có thể viết lại như một cái khác JOIN. Điều này thường đơn giản và nhanh nhất:

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

Tôi cũng đã đơn giản hóa phần nào và bỏ đi cách đánh vần CamelCase vô cớ.


1
Vâng cái này. Tôi chết một chút bên trong bất cứ khi nào tôi thấy cú pháp IN (SELECT ..).
Mark Storey-Smith

@ MarkStorey-Smith Bạn có nghĩa là nó đơn giản hơn và nhanh hơn: đây là một tiêu chuẩn của mã hóa sql để sử dụng cái khác jointhay vì trong in ( select...)trường hợp như vậy tôi cũng nên gán câu trả lời tốt cho Erwin.
Stephane Rolland

1
@StephaneRolland Cho dù nhanh hơn hay không sẽ phụ thuộc vào nền tảng và phiên bản. Ví dụ, SQL Server 2008+ sẽ tạo các kế hoạch thực hiện giống hệt nhau cho cú pháp INNER THAM GIA và IN (CHỌN ...). Không có ý tưởng về việc áp dụng tương tự cho PostgreSql. Bỏ qua hiệu suất, kiểu IN (CHỌN ...) khiến tôi tự hỏi liệu tác giả đã nắm bắt hoàn toàn ngữ nghĩa và khái niệm của SQL hay chưa. AngrySpartan đã trả lời chính xác câu hỏi ban đầu của bạn. ErwinBrandstetter đã chỉ cho bạn cách bạn nên làm :).
Mark Storey-Smith

6
@ MarkStorey-Smith: THAM GIA không phải lúc nào cũng tương đương với điều kiện IN. Câu hỏi không phải là cái nào nhanh hơn, câu hỏi nào là cái nào đúng.
a_horse_with_no_name
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.