我在table1.id
和table2.parent_id
之间有一对多的表格关系,并希望根据table1.id
选择table2.status
。
SELECT table1.id FROM table1
INNER JOIN table2 ON table2.parent_id = table1.id
WHERE table2.status = 1
如果table2
中只有一个关系,那么这就是我想要的。但是,如果table2
中有更多行,则一个结果可能有status=1
但另一个结果有status=2
。
我想要的是仅当table1.id
的所有结果都是table2
时才能获得status=1
的结果。
实施例
table1
id=1, name=row1
id=2, name=row2
table2
id=1, parent_id=1, status=1
id=2, parent_id=1, status=2
id=3, parent_id=2, status=1
id=4, parent_id=2, status=1
在上面的例子中,table1.id = 1
有两个不同状态的关系,我不想要这一行。 table1.id = 2
与同一status=1
有2个关系,我想要这个结果。
答案 0 :(得分:0)
您可以使用EXISTS
和NOT EXISTS
来检查其他表格中的值。
此查询选择Table1中具有表2中匹配记录的所有行,但这些行的状态均不等于1。
SELECT *
FROM Table1 t1
WHERE -- Check for matching records in Table2.
EXISTS
(SELECT 'x' FROM Table2 t2
WHERE t2.parent_id = t1.id)
-- Skip rows that have a status different than 1.
AND NOT EXISTS
(SELECT 'x' FROM Table2 t2
WHERE t2.parent_id = t1.id
AND t2.status <> 1)
如果表2中根本没有状态,我不确定你想拥有什么。如果要从Table1返回表2中没有任何匹配行的行,则可以省略第一个EXIST <subselect>
部分。