[英]SQL: Select records where ALL joined records satisfy some condition
只有當連接表中的所有關聯記錄滿足某些條件時,如何編寫僅返回記錄的SQL查詢。
例如,如果A有很多B,我想SELECT * FROM A WHERE給定A的所有相關B都有B.some_val>值
我知道這可能是一個非常基本的問題,所以感謝您的幫助。 此外,如果它有所作為,我正在使用postgres。
山姆
假設不需要關聯,請使用:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
HAVING MIN(b.some_val) > a.val)
如果你確實需要相關性:
SELECT a.*
FROM A a
WHERE EXISTS(SELECT NULL
FROM B b
WHERE b.id = a.id
HAVING MIN(b.some_val) > a.val)
EXISTS
根據第一個匹配對布爾值進行求值 - 這比使用IN更快,而且 - 與使用JOIN不同 - 不會重復行。 SELECT部分無關緊要 - 您可以將其更改為EXISTS SELECT 1/0 ...
並且查詢仍然有效,盡管存在明顯的零錯誤除法。
EXISTS
的子查詢使用聚合函數MIN來獲得最小的B.some_val - 如果該值大於a.val值,則a.val小於所有b值。 WHERE
子句的唯一需要是用於關聯 - 聚合函數只能在HAVING
子句中使用。
select * from A
where -- at least one record in B is greater than some_val
exists (select null from B
where B.some_val > :value
and A.join_column = B.join_column)
and -- no records in B are not greater than some_val
not exists (select null from B
where B.some_val <= :value
and A.join_column = B.join_column)
你想要一個INNER JOIN:
SELECT
A.*
FROM
A
INNER JOIN B
ON A.identifier = B.identifier
WHERE
B.some_val > value
您需要確保存在從A到B的外鍵或其他常用標識符。
select * from a where a.key = b.a_key where b.value > condition
以書店和書籍為例。
bookstoreID,bookID
bookID,價格
我想你想要歸還所有書籍價格都高於X的書店。
select *
from Bookstore bs1
where bs1.bookstoreID not exist
(
select bs.bookstoreID
from Bookstore bs, Book b
where bs.bookID= b.bookID
b.price < x; -- your value
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.