2014-08-27 4 views
0

JOIN 문을 여러 테이블의 선택 값에 사용하려고하면 ORA-00932: inconsistent datatypes: expected - got BLOB이 표시됩니다. 는 IS 다음 내 오라클 SQL 코드 :ORA-00932 : 일치하지 않는 데이터 유형 : 예상 됨 - 다른 테이블을 조인 할 때 BLOB가 발생했습니다.

questions :

id int not null, 
question varchar(999), 
details varchar(1000) not null, 
author int not null, 
datetime varchar(999) 

answers

id int not null, primary key(id), 
question int not null, 
answer blob not null, 
usr int not null, 
ansdatetime int not null 

questions_tags

SELECT 
    MAX(questions.id), 
    MAX(questions.question), 
    MAX(questions.author), 
    MAX(questions.datetime), 
    MAX(answers.answer), 
    MAX(answers.usr), 
    MAX(answers.ansdatetime) 
FROM 
    questions 
LEFT JOIN 
    answers ON 
     questions.id = answers.question 
LEFT JOIN 
    questions_tags ON 
     questions.id = questions_tags.question_id 
WHERE 
    questions_tags.tag_id IN (1,2,3,4,5,6) 
GROUP BY 
    questions.id, answers.id 
ORDER BY 
    questions.datetime DESC 

다음 세 가지 테이블에 대한 테이블 구조

id INT NOT NULL, 
question_id INT NOT NULL, 
tag_id INT NOT NULL, 
PRIMARY KEY(id) 

여기에 무슨 문제가 있습니까?

+0

내 생각에 BLOB 값에는 MAX가 정의되어 있지 않아서 MAX (answers.answer)가 실패합니다. 어쨌든 각 열의 MAX를 개별적으로 취하는 것이 아니라 실제로 하위 쿼리가 필요합니다. 또는 단지 선택된 ID를 표시하지 않고 GROUP BY에 모든 선택된 열을 넣을 수 있습니다. – IMSoP

+0

'answers.answer'는'blob'입니다. 'blob'에서'MAX'를 할 수 없습니다. 그러나 각각의 개별 열에 대해 'MAX'를 수행하기를 원하지는 않습니다. 일반적으로 여러 행에 대해 데이터를 함께 결합합니다. 특정 질문에 대한 가장 최근의 답변을 정말로 받고 싶습니까? –

+0

@JustinCave 예, 답변이있는 경우 반환되는 질문에 대해 가장 최근의 답변을 받아야합니다. – DemCodeLines

답변

3

의견에서 말한 것처럼 blob 열에서 max을 수행 할 수 없기 때문에이 방법은 작동하지 않습니다. 그러나이 쿼리는 집계를 사용하지 않도록 다시 작성할 수 있습니다.

with a as (
    select 
     *, -- might need to enumerate columns 
     row_number() over (partition by question order by ansdatetime desc) as rn 
    from 
     answers 
) 
select 
    q.id, 
    q.question, 
    q.author, 
    q.datetime, 
    a.answer, 
    a.usr, 
    a.ansdatetime 
from 
    questions q 
     left join 
    a 
     on q.id = a.question and rn = 1 -- assuming you're only looking for latest answer per q 
where 
    exists (
     select 
      'x' 
     from 
      questions_tags t 
     where 
      q.id = t.question_id and 
      t.tag_id in (1,2,3,4,5,6) 
    ) 
order by 
    q.datetime desc 
+0

Gah. 나는 그가 진지한 제안보다 더 많은 농담으로 그 괴물을 게시했다고 썼다. MySQL에서 엔진은 단순히 해당 열의 첫 번째 행을 가져오고, 그룹에 속하지 않는 select 열을 가질 수 있습니다. 내가 알고있는 것을 기반으로 초기 쿼리를 작성했다. (MySQL), 오클라호마에서 작동하지 않았을 때 농담으로 MAX를 제안했다. 자, 당신이해야 할 복잡 한 쓰레기를보고 ... 나는 실제로 MySQL에 대해 뭔가를 좋아한다. 허. 대답에 +1, 나는 그것을 할 수 있다면 오라클을 다루는 인내심을 가지고 그것을 +2로 만들 것입니다. –

+1

@Chris 실제로 MySQL은 해당 열의 첫 번째 행을 취하지 않고 각 그룹에서 좋아하는 행을 취합니다. * : "서버는 각 그룹의 값을 자유롭게 선택할 수 있으므로 같지 않으면 선택한 값은 불확정합니다. "] (http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html). PostgreSQL (아마도 오라클도 될 것입니다.)에서, 당신은'FIRST()'집계 함수를 정의하고 내장 된 ORDER BY ('SELECT FIRST (x ORDER BY y) * 각 그룹의 첫 번째 보장됩니다. 이것은 MySQL이 견고성을 갖추기 전에 편의를 제공하는 좋은 예입니다. – IMSoP

+0

@IMSoP 충분히 좋습니다. 나쁜 일인지 ... MySQL에서 여전히 집계 함수를 사용할 수 있습니다 (또는 "FULL GROUP BY"사용). 따라서 열의 출처가 중요한 경우 지정할 수 있습니다. MySQL은 MySQL이 두 플랫폼 모두에서 최고의 것을 얻었습니다. –

관련 문제