2012-07-13 2 views
2

SQL (Oracle DB) 을 사용하여 값 집합에서 누락 된 값을 찾는 방법은 무엇입니까? 'HYUNDAI'는 계정 테이블에없는 경우 SQL을 사용하여 값 집합에서 누락 된 값을 찾습니다.

SELECT NAME 
FROM ACCOUNT 
WHERE ACCOUNT.NAME IN ('FORD','HYUNDAI','TOYOTA','BMW'...) 

를 (이하 "IN"절은 값의 수백을 포함 할 수있다), I는 "현대"로 결과를 얻을 필요가있다.

현재 위 쿼리의 결과를 사용하여 누락 된 값을 찾기 위해 원래 값 집합에 대해 Vlookup을 수행하고 Vlookup을 수행하지 않고 누락 된 값을 직접 가져 오려고합니다.

감사 키란,

+1

사용하고있는 DBMS 열에 표시해야합니까? –

답변

5

역순으로 처리됩니다. 이 작업을 수행합니다 : http://www.sqlfiddle.com/#!2/09239/3

SELECT Brand 
FROM 
(
    -- Oracle can't make a row without a table, need to use DUAL dummy table 
    select 'FORD' as Brand from dual union 
    select 'HYUNDAI' from dual union 
    select 'TOYOTA' fom dual union 
    select 'BMW' from dual  
) x 
where Brand not in (select BrandName from account) 

샘플 계정 데이터 :

create table account(AccountId int, BrandName varchar(10)); 

insert into account(AccountId, BrandName) values 
(1,'FORD'), 
(2,'TOYOTA'), 
(3,'BMW'); 

출력 :

select * 
from Brand 
where BrandName not in (select BrandName from account) 
:

| BRAND | 
----------- 
| HYUNDAI | 
아직 더 나은

이 테이블에 브랜드를 구체화

출력 :

| BRANDNAME | 
------------- 
| HYUNDAI | 

샘플 데이터와 실제 시험 : http://www.sqlfiddle.com/#!2/09239/1

CREATE TABLE Brand 
    (`BrandName` varchar(7)); 

INSERT INTO Brand 
    (`BrandName`) 
VALUES 
    ('FORD'), 
    ('HYUNDAI'), 
    ('TOYOTA'), 
    ('BMW'); 


create table account(AccountId int, BrandName varchar(10)); 

insert into account(AccountId, BrandName) values 
(1,'FORD'), 
(2,'TOYOTA'), 
(3,'BMW'); 
+0

나는 이것이 효과가있을 것이라고 생각하지만, 수백 개의 값이 있으면 쿼리를 입력하는 것이 지루합니다. (하지만 Excel을 사용할 수는 있습니다.) 다른 옵션은 없습니까? – Kiranshell

+0

테이블을 만들 수 없으므로이게 까다 롭습니다. – Kiranshell

+0

테이블을 만들 수 없다면 하위 쿼리 (위의 대답 참조)에 'UNION'을 사용하거나 MySQL, PostgreSQL, Sql Server를 사용하고 있다면 'VALUES' 단축키를 사용할 수 있습니다 –

0

당신은 사용해야 Except : 어떤 고유 한 값도 오른쪽 쿼리에없는 왼쪽 쿼리에서 반환 제외.

WITH SomeRows(datacol) --It will look for missing stuff here 
AS(SELECT * 
    FROM ( VALUES ('FORD'), 
        ('TOYOTA'), 
        ('BMW') 
        ) AS F (datacol)), 
AllRows (datacol) --This has everthing 
AS(SELECT * 
    FROM ( VALUES ('FORD'), 
        ('HYUNDAI'), 
        ('TOYOTA'), 
        ('BMW') 
        ) AS F (datacol)) 
SELECT datacol 
FROM AllRows 
EXCEPT 
SELECT datacol 
FROM SomeRows 
+0

"Not In"은 내가 쿼리했지만 테이블에있는 값이 아닌 다른 값을 제공합니다. – Kiranshell

+0

예, "not in"이 대답이 아니므로 대답을 변경했습니다. [EXCEPT] (http://technet.microsoft.com/en-us/library/ms188055.aspx)를 사용하십시오. – Luxspes

+0

나는 누락 된 요소가 무엇인지 모를 것이며, HYUNDAI는 단지 예일뿐입니다. – Kiranshell

0

당신은 할 수는 :

SELECT a.val 
FROM 
(
    SELECT 'FORD' val UNION ALL 
    SELECT 'HYUNDAI'  UNION ALL 
    SELECT 'TOYOTA'  UNION ALL 
    SELECT 'BMW'   UNION ALL 
    etc... 
    etc... 
) a 
LEFT JOIN account b ON a.val = b.name 
WHERE b.name IS NULL 
0

이것은 완벽하게 감사 마이클했다.

SELECT Brand 
FROM 
( -- Oracle can't make a row without a table, need to use DUAL dummy table 
    select 'FORD' as Brand from dual union 
    select 'HYUNDAI' from dual union 
    select 'TOYOTA' fom dual union 
    select 'BMW' from dual  
) 
where Brand not in (select BrandName from account) 

Luxspes와 젠 쉽게 대답의 입력하도록 엑셀 코드를 기여하여 입력

-1

주셔서 감사합니다 :

말 열 A가 값이을 (포드, 현대, ...) . 컬럼 C에서

select 'x' as brand from dual union 

이것을 수식을 작성하고, 그것을 다운 복사

칼럼 B에서, 각 셀에 넣고.

=REPLACE(A2,9,1,A1)

select/union 문의 모든 C.

관련 문제