2017-09-29 4 views
0

件名にエラーが発生したSQL文を作成しようとしています。私はこのエラーに他のトピックがあることを理解していますが、私は複数の行に基づいて値を取得しようとしている私の特定の問題に関しては何も見ていません。私はどんな洞察にも感謝します。ここに私の単純化されたテーブルとSQLステートメントがあります。SQLエラーに関する問題:1行以上のサブクエリが返されました

TableAの

member_id 
---------- 
1 
2 
3 
4 

TableBの

user_id field_id value 
------------------------ 
1  1   red 
2  2   red 
1  2   blue 
4  1   red 
2  1   blue 
3  1   blue 

問合せ:

SELECT DISTINCT(member_id) 
FROM TableA 
WHERE member_id = (SELECT b.user_id 
        FROM TableB b 
        INNER JOIN TableB a on a.user_id = b.user_id 
        WHERE a.field_id = '1' ANd a.value = 'red' 
        AND b.field_id = '2' ANd b.value = 'blue') 

私はようなテーブルAからmember_idを選択しようとしています表Bにおいて、ユーザのfield_id(1)=赤であり、同じユーザのfield_id(2)=青である表Bの。したがって、select文は、ID = 1

+0

エラーを報告しますか?私はあなたがあなたのサブクエリに別のものを入れて、外側のクエリを完全に消去することで、あなたが望むものを得ることができると思います。 –

答えて

1

あなたが選択し、ちょうどJOINサブのために持っていたクエリを使用しますtableA。

SELECT a.* 
FROM TableB b1 
INNER JOIN TableB b2 on b1.user_id = b2.user_id 
INNER JOIN tableA a ON a.member_id = b1.user_id 
WHERE b2.field_id = '1' ANd b2.value = 'red' 
    AND b1.field_id = '2' ANd b1.value = 'blue' 
0

でMEMBER_IDを返す必要がありますあなたの内側のクエリは、内側をやっている

は、それ自体にテーブルBの結合。これはほとんど決して必要ではありません。

あなたはuser_id = member_idにtableAのレコード、およびfield_ID = 1value = red、またはfield_id = 2value = blueをしたい場合は、あなたがより多くのこのような何かをお勧めします:あなたは、彼らは両方を持っているレコードだけをしたい場合は、

SELECT distinct(member_id) 
FROM TableA inner join TableB on user_id = member_id 
WHERE (field_id = '1' AND value = 'red') 
    OR (field_id = '2' AND value = 'blue') 

を元の内側のクエリに別名を投げるだけです。 user_idによって

+0

私はあなたのロジックに欠陥があり、本当に2つの結合が必要だと思います。彼がANDを置くと、条件(field_id = '1'とsomethingelse)と(field_id = '2'など)は決して真実ではありません。 –

+0

良い点。彼の元の投稿に対するあなたのコメントも正しいです。 – TheAtomicOption

1

グループ化、あなたはヒットを数えてみてくださいし、それに応じてフィルタリングすることもできます

SELECT user_id 
    FROM tableB 
    GROUP BY user_id 
    HAVING SUM(CASE WHEN field_id = 1 AND value = 'red' THEN 1 ELSE 0 END) > 0 
    AND SUM(CASE WHEN field_id = 2 AND value = 'blue' THEN 1 ELSE 0 END) > 0 

そして、どのように別の変化について:

SELECT * 
    FROM tableA AS a 
    WHERE EXISTS (SELECT 1 FROM tableB b where b.user_id = a.member_id AND B.field_id = 1 AND B.value = 'red') 
    AND EXISTS (SELECT 1 FROM tableB b where b.user_id = a.member_id AND B.field_id = 2 AND B.value = 'blue') 
関連する問題