鉴于此架构:
CREATE TABLE t (
id int,
name varchar(200),
primary key (id)
);
CREATE TABLE t2 (
id int,
name varchar(200),
primary key (id)
);
CREATE TABLE rel (
id1 int,
id2 int,
value int,
primary key (id1, id2),
foreign key (id1) REFERENCES t(id),
foreign key (id2) REFERENCES t2(id)
);
我应该如何查询t
满足超过 1 个关系的行t2
?这听起来很容易,但我不确定在这种情况下最佳做法是什么。我将通过查询更好地解释:
SELECT t.id, t.name
FROM t
INNER JOIN rel ON (t.id = rel.id1)
INNER JOIN t2 ON (t2.id = rel.id2)
WHERE (rel.id2 = 1 AND rel.value = 1)
当我需要找到满足一种关系的行时,上述方法效果很好。但现在:
SELECT t.id, t.name
FROM t
INNER JOIN rel ON (t.id = rel.id1)
INNER JOIN t2 ON (t2.id = rel.id2)
WHERE (rel.id2 = 1 AND rel.value = 1)
AND (rel.id2 = 2 AND rel.value = 2)
对于 2 个关系,此查询将永远不会起作用,因为连接的行永远不会在一行中有 2 个不同的关系,因此它将始终返回0
行。
到目前为止,我一直在使用的解决方案是从关系中寻找作为结果集的t.id
s :IN
SELECT t.id, t.name
FROM t
WHERE (t.id IN (SELECT id1 FROM rel WHERE rel.id2 = 1 AND rel.value = 1))
AND (t.id IN (SELECT id1 FROM rel WHERE rel.id2 = 2 AND rel.value = 2))
这行得通,但没有更好的方法吗?我觉得我写了太多的 SQL 并且为每个项目做一个子查询对于如此简单的事情似乎有点过分了。
这是SQL 小提琴