2

SQL(Oracle DB)などを使用して、一連の値から欠損値を見つけるにはどうすればよいですか

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

(「IN」句には数百の値が含まれる場合があります) ACCOUNT テーブルに「HYUNDAI」がない場合、結果を「HYUNDAI」として取得する必要があります。

現在、上記のクエリの結果を使用して、元の値のセットに対して Vlookup を実行し、欠損値を見つけています。Vlookup を実行せずに欠損値を直接取得したいと考えています。

ありがとうキラン、

4

5 に答える 5

6

あなたはそれを逆にしました。これを行います: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');

出力:

|   BRAND |
-----------
| HYUNDAI |

さらに良いことに、ブランドを表に具体化します。

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

出力:

| 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');
于 2012-07-13T05:26:27.293 に答える
0

Exceptを使用する必要があります。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
于 2012-07-13T05:20:43.247 に答える
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 と Zane さん、ご意見ありがとうございます

于 2012-07-13T22:16:20.853 に答える
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
于 2012-07-13T05:47:59.637 に答える