2016-10-26 4 views
2

나는이 모양을 그 안에 SELECT와 DECODE 문을 쓰기 위해 노력하고있어 내부 (둘 이상의 행을 반환) SELECT : 분명히는 (신탁) DECODE

SELECT DECODE(A.name, (SELECT name FROM B WHERE id IN (1000,1001)),'Value1','Value2') FROM A 

을 경우 DECODE 안에 내 선택 문 둘 이상의 행을 반환합니다. "ORA-01427 : 단일 행 하위 쿼리는 둘 이상의 행을 반환합니다"예외가 발생합니다. 어느 것이 충분합니다.

여기에 하나 이상의 행이 표시 될 것으로 예상됩니다. 그 이유는 A.name 및 Value2와 일치하는 모든 항목에 대해 Value1을 표시해야합니다. foreach 루프와 비슷하지만 DECODE 내부.

올바른 방법은 무엇입니까?

업데이트 : 표 A :

+--------------+--------+ 
|Surname  | Name | 
+--------------+--------+ 
|   Abc| John | 
|   Smith| Piter | 
|   Cook| Ann | 
+--------------+--------+ 

표 B : 내가 볼 것으로 예상 무엇

+--------------+--------+ 
|ID   | Name | 
+--------------+--------+ 
|   1000| John | 
|   1001| Piter | 
|   2003| Ann | 
+--------------+--------+ 

:

값 1을

값 1

값 2

당신이 CASE 문을 사용할 수있는이 상황에서
+0

하는 테이블을 보여주세요 정의, 샘플 데이터 및 예상 출력이 포함됩니다. – OldProgrammer

+0

전체 검색어를 표시하십시오. A와 B는 무엇이며 그들 사이에 어떤 관계가 있습니까? – Kacper

+0

B에 동일한 이름의 행이 여러 개있을 수 있습니까? – Aleksej

답변

5

: 당신은 내부와이 문제를 해결 할 수

SELECT 
    CASE WHEN 
      a.name in (select name from b where id in (1000, 1001)) then 'Value1' 
     ELSE 'Value2' 
    END 
FROM a; 
+0

이것은 정확히 내가 필요한 것입니다. 감사합니다! 완벽하게 일했습니다. – Dzhara

2

가입 :

-- Test case setup 
CREATE TABLE A(SURNAME, NAME) AS 
SELECT 'Abc', 'John' FROM DUAL UNION ALL 
SELECT 'Smith', 'Piter' FROM DUAL UNION ALL 
SELECT 'Cook', 'Ann' FROM DUAL; 

CREATE TABLE B(ID, NAME) AS 
SELECT 1001, 'John' FROM DUAL UNION ALL 
SELECT 1002, 'Piter' FROM DUAL UNION ALL 
SELECT 2003, 'Ann' FROM DUAL; 

-- Solution 
SELECT CASE WHEN B.ID IN (1001, 1002) 
      THEN 'Value1' 
      ELSE 'Value2' 
     END Value 
    FROM A, B 
WHERE A.NAME = B.NAME 

결과 :

VALUE 
------ 
Value1 
Value1 
Value2