我有一个3个表X、Y、Z。
表Y中的条目有一个列Y.x_id,其中包含作为FK.的x.id
表Z中的条目有两列Z.x_id、Z.y_id用于x.id和y.id。
X和Y具有一对多映射。
Y和Z具有一对一映射。
所以X和Z也有一对多映射。
如果对于给定的X.id,Y中的所有相关条目也存在于表Z中,那么最好的查找方法是什么。如果Y中与X.id相关的所有条目也在Z中,则我需要根据X.id更新X中的列。
现在我正在写两个问题。
内部联接b/w Y&X:
select Y.id
from Y
join X
on X.id = Y.x_id
where X.id= ?;
内部联接b/w Y&X&Z:
select Y.id
from Y
join X
on X.id = Y.x_id
join Z
on (Z.x_id = X.id AND Z.y_id = Y.id)
where X.id = ?;
然后匹配计数,这两个查询的值(Java端(。
在mysql中有更好的方法吗?我有非常基本的sql知识,无法在网上找到好的线索。
谢谢你的帮助。
EXISTS子句应该可以完成这个任务。
SELECT Y.id
FROM Y, X
WHERE X.id = Y.x_id
AND X.id = ?
AND EXISTS (SELECT 1
FROM Z
WHERE Z.x_id = X.id
AND Z.y_id = Y.id)
如果您想知道表Z中是否有与X和Y中的行匹配的行,可以向SELECT
子句添加count(*)
。这将返回具有匹配行数的1行。然后,您可以检查代码中是否存在row_count > 0
。
SELECT count(*) row_count
FROM Y, X
WHERE X.id = Y.x_id
AND X.id = 2
AND EXISTS (SELECT 1
FROM Z
WHERE Z.x_id = X.id
AND Z.y_id = Y.id)