2012-05-21 43 views
1

我有两张表。 第一个是一个类型,第二个是这个类型的值。 在我的例子中,如果有多个值“约翰”为“FIRST_NAME”我得到:single-row subquery returns more than one row`单行子查询返回多行'错误unclarity

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或类似的东西,但我不清楚我应该如何做到这一点。

+0

您的查询是不好的。但是请描述你想要达到的目标,以便我们写出一个好的。 –

回答

1

除了简单的修补程序(使用而不是ID =),你也可以用你的查询的略为简单版本:

SELECT DISTINCT id FROM name WHERE text1='first_name' 
and id in (
SELECT name_id FROM value WHERE text2='john') 
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'); 

或者,如果你希望只一排,你要检查您的数据库的逻辑和行为。

+0

然后你应该在你的查询中包含IN子句;-) –

0

你可以只改变 WHERE ID = 到 WHERE ID IN

+0

你也可以放入一个SELECT TOP 1 - 但我不确定你是否想这么做? – LordWabbit

2

由于子查询[能够]返回多个值,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) 

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

相关问题