2

我有两张桌子。第一个持有一个类型,第二个持有这个类型的值。在我的示例中,如果有更多值 'john' 作为 'first_name' 我得到:single-row subquery returns more than one row

SELECT DISTINCT id FROM name WHERE id=(
 SELECT id FROM name WHERE text1='first_name' INTERSECT
 SELECT name_id FROM value WHERE text2='john');

我对sql不是很好。我应该使用LEFT JOIN或类似的东西,但我不清楚我应该如何做到这一点。

4

4 回答 4

3

由于子查询 [can] 返回多个值,IN=

SELECT DISTINCT id 
FROM name 
WHERE id IN (
        SELECT id FROM name WHERE text1='first_name' 
        INTERSECT
        SELECT name_id FROM value WHERE text2='john');

IN等价于OR,例如:

SELECT *
FROM tableName
WHERE a = 4 or a = 5 or a = 6

可以写成

SELECT *
FROM tableName
WHERE a in (4,5,6)

=等号)用于分配单个值。

于 2012-05-21T08:17:17.370 回答
1

除了简单的修复(使用 IN 而不是 id=),您还可以使用更简单的查询版本:

SELECT DISTINCT id FROM name WHERE text1='first_name' 
and id in (
SELECT name_id FROM value WHERE text2='john')
于 2012-05-21T08:14:52.143 回答
0
SELECT id FROM name WHERE text1='first_name' INTERSECT
SELECT name_id FROM value WHERE text2='john');

此查询返回多行,那么您应该使用IN这里的子句

SELECT DISTINCT id FROM name WHERE id IN (
SELECT id FROM name WHERE text1='first_name' INTERSECT
SELECT name_id FROM value WHERE text2='john');

或者,如果您只期望一行,则必须查看数据库的逻辑和行为。

于 2012-05-21T08:10:13.600 回答
0

您可以将 WHERE id= 更改为 WHERE id IN

于 2012-05-21T08:14:20.513 回答