2015-01-05 3 views
-3

이번 주에 어떤 학생이 앱에 로그인했는지 찾는 쿼리를 작성했습니다. 내 SQLite 쿼리는 다음과 같습니다.SQL 쿼리가 하위 쿼리와 동일한 값을 반환하지 않음 [solved]

public static final String WHOLE_QUERY = "SELECT " + DBHelperTest.USER_ID 
      + " , " + DBHelperTest.FNAME + " , " + DBHelperTest.SNAME 
      + " FROM " + DBHelperTest.TABLE_CHILD + " WHERE " 
      + DBHelperTest.USER_ID + " = (SELECT " + DBHelperTest.USER_ID 
      + " FROM " + DBHelperTest.TABLE_SESSION_DATA + " WHERE " 
      + DBHelperTest.WEEK_OF_YEAR_SIGNED_IN + " = " + theWeek() + " AND " 
      + DBHelperTest.YEAR_SIGNED_IN + " = " + theYear() + ") " + " AND " 
      + DBHelperTest.USER_ID + " = (" + "SELECT " 
      + DBHelperTest.Child_USER_ID + " FROM " + DBHelperTest.TABLE_CLASS 
      + " WHERE " + DBHelperTest.Teacher_USER_ID + " = (SELECT " 
      + DBHelperTest.USER_ID + " FROM " + DBHelperTest.TABLE_SESSION_DATA 
      + " WHERE " + DBHelperTest.SESSION_ID + " = (SELECT MAX(" 
      + DBHelperTest.SESSION_ID + ") FROM " 
      + DBHelperTest.TABLE_SESSION_DATA + ")))"; 

아무 것도 반환하지 않습니다. 나는 두 개의 질의 ...

으로 분할 그러나 경우 먼저이 쿼리는 이번 주에 로그인 한 모든 사용자를 보여줍니다

public static final String LOGGED_IN_THIS_WEEK_QUERY = "SELECT " 
      + DBHelperTest.USER_ID + " , " + DBHelperTest.FNAME + " , " 
      + DBHelperTest.SNAME + " FROM " + DBHelperTest.TABLE_CHILD 
      + " WHERE " + DBHelperTest.USER_ID + " = (SELECT " 
      + DBHelperTest.USER_ID + " FROM " + DBHelperTest.TABLE_SESSION_DATA 
      + " WHERE " + DBHelperTest.WEEK_OF_YEAR_SIGNED_IN + " = " 
      + theWeek() + " AND " + DBHelperTest.YEAR_SIGNED_IN + " = " 
      + theYear() + ") "; 

이 쿼리 userId를 "Jasm"을 사용자에게 출력합니다.

public static final String CHILD_WITH_SAME_TEACHER_QUERY = "SELECT " 
       + DBHelperTest.Child_USER_ID + " FROM " + DBHelperTest.TABLE_CLASS 
       + " WHERE " + DBHelperTest.Teacher_USER_ID + " = (SELECT " 
       + DBHelperTest.USER_ID + " FROM " + DBHelperTest.TABLE_SESSION_DATA 
       + " WHERE " + DBHelperTest.SESSION_ID + " = (SELECT MAX(" 
       + DBHelperTest.SESSION_ID + ") FROM " 
       + DBHelperTest.TABLE_SESSION_DATA + "))"; 

이 쿼리 userId를의 "Jasm"와 "thup"사용자에게 출력 :

는 두 번째로이 쿼리는 주어진 교사와 관련된 모든 사용자를 보여줍니다.

왜이 사용자가 두 기준을 모두 충족하므로 내 원래 쿼리가 "Jasm"의 세부 정보를 출력하지 않습니다.

더 쉽게 읽을 버전은 아래를 참조하십시오

전체 쿼리

SELECT USER_ID , FNAME , SNAME 
FROM TABLE_CHILD 
WHERE USER_ID = 
(
SELECT USER_ID 
FROM TABLE_SESSION_DATA 
WHERE WEEK_OF_YEAR_SIGNED_IN = theWeek() 
AND YEAR_SIGNED_IN = theYear() 
) 
AND USER_ID = 
(
SELECT Child_USER_ID 
FROM TABLE_CLASS 
WHERE Teacher_USER_ID = 
(
SELECT USER_ID 
FROM TABLE_SESSION_DATA 
WHERE SESSION_ID = 
( 
SELECT MAX(SESSION_ID) 
FROM TABLE_SESSION_DATA))) 

상반기

SELECT Child_USER_ID 
FROM TABLE_CLASS 
WHERE Teacher_USER_ID = 
(
SELECT USER_ID 
FROM TABLE_SESSION_DATA 
WHERE SESSION_ID = 
( 
SELECT MAX(SESSION_ID) 
FROM TABLE_SESSION_DATA)) 
+2

문자열을 생성하는 코드 대신 * after * 대체 문자열 값을 입력하면 질문을 이해하는 것이 훨씬 더 쉬울 것입니다. 귀하의 코드는 읽기가 매우 어렵습니다. –

+0

귀하의 의견을 주셔서 감사합니다, 내가 이렇게 한 이유는 내 코드의 모든 오류가 정확하게 기록되었는지 확인하는 것입니다. 그러나 나는이 코멘트를 기꺼이 받아 들일 것이고 더 읽기 쉬운 형식으로 코드를 추가 할 것이다. 나는 당신이 더 비슷한 것을 원한다고 생각한다 : SELECT userId, fName, sName FROM table_child ..? –

+0

데이터베이스가 실제로 실행중인 코드를 포함해야합니다. 문제는 SQL 쿼리의 결과와 관련이있는 것 같습니다. 그것이 당신이 집중해야하는 것입니다. 그 질문이 어떻게 쓰여지는 것은 당신의 질문에 대답하는 것과는 무관합니다. –

답변

0

사용하십시오

SELECT USER_ID , FNAME , SNAME 
FROM TABLE_CHILD 
WHERE USER_ID = 
(
SELECT USER_ID 
FROM TABLE_SESSION_DATA 
WHERE WEEK_OF_YEAR_SIGNED_IN = theWeek() 
AND YEAR_SIGNED_IN = theYear() 
) 

초 절반 " IN "operato r 대신 "="를 사용하여 하나의 결과 대신 여러 개의 결과를 선택하십시오. 코드에서

: 흥미로운

+ DBHelperTest.USER_ID + " IN (SELECT " + DBHelperTest.USER_ID 
... 
+ DBHelperTest.USER_ID + " IN (" + "SELECT " 
+0

당신은 아마 내가 새로운 것을 가르쳐 주셔서 대단히 감사합니다. –

0

흠. 필자는이 형식을 멋지게 형식화 된 SQL 형식으로 작성했습니다 (날짜 기능을 필자가 익숙한 해당 T-SQL 기능으로 변경했습니다).

코드를 볼 수 있도록이 쿼리로 재생할 수있는 기본 데이터가 없습니다.

이것은 독립적 인 일련의 독립된 하위 쿼리로 보입니다. 언뜻보기에는 작동해야합니다.

가장 깊은 하위 쿼리는 NULL 또는 단일 값을 반환합니다. 다른 모든 하위 쿼리는 "="을 사용하고 동등성 연산자는 둘 이상의 값에서 작동하지 않습니다. 결과 집합에서 둘 이상의 값이 가능할 수도 있지만 하위 쿼리를 볼 수도 있습니다. 아마도 SQLite에서 의미있는 오류 메시지를 다시받지 못했을 것입니다.

어쩌면 이렇게 잘못 될 수 있습니까? 가치가 어딘가에 반환되는 것 이상입니까? "="대신 "IN"을 사용하면 더 명확해질 수 있습니까?

그렇지 않은 경우 문제가 중복 될 수있는 샘플 데이터를 게시 할 수 있습니까?

+0

Andy 당신은 전설이며, 당신의 대답에 많은 노력을 기울여 주어서 고맙습니다. 내가 충분한 명성을 얻으면 너에게 업보트를 줄거야! 이미 첫 번째 대답을 수락 했으므로 사용자가 여러 결과를 얻을 수 있으므로 "="대신 IN 절을 사용해야한다고 지적했습니다. 나는 지금 이것을 연구했고, 전문가를 괴롭히지 않고 장래에 그것을 사용할 수있을 것이다! –

+0

또한 T-SQL과 관련하여 최고의 팁을 주셔서 감사합니다. –

관련 문제