2012-07-13 58 views
2

我怎樣才能找到一組值的遺漏值,使用SQL(Oracle數據庫) 例如找到失蹤的值,使用SQL

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

(在「IN」的條款可能包含數百個值) 如果「現代」在賬戶表丟失,我需要得到的結果是「HYUNDAI」。

目前我使用上面的查詢結果做一個VLOOKUP對原設定值來尋找失蹤的價值觀,我想直接將缺失值,而不做VLOOKUP。

感謝 基蘭,

+1

您正在使用什麼數據庫管理系統出現在列? – 2012-07-13 05:49:47

回答

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'); 

輸出:

| 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'); 
+0

我認爲,這將工作,但會如果有數以百計的值,那麼輸入查詢就很乏味(但可以使用Excel)。任何其他選項? – Kiranshell 2012-07-13 05:36:10

+0

我沒有創建表的權限,這就是爲什麼這是棘手的問題 – Kiranshell 2012-07-13 05:39:07

+0

如果你不能創建表,只需在子查詢上使用'UNION'(見上面的答案),或者如果你使用MySQL,Postgresql,Sql Server可以使用'VALUES'快捷鍵 – 2012-07-13 05:41:13

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

「不在」會給我以外的價值,而不是我查詢過的,但是在表中。 – Kiranshell 2012-07-13 05:28:05

+0

是的,「不在」不是答案,我改變了我的答案,請使用[EXCEPT](http://technet.microsoft.com/en-us/library/ms188055.aspx)。 – Luxspes 2012-07-13 05:38:51

+0

我不知道哪個是缺失的元素,HYUNDAI只是一個例子。 – Kiranshell 2012-07-13 05:41:51

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

貢獻Excel中的代碼讓用戶輕鬆的回答類型:

說A列中的值爲(福特,現代,...) 。

在B列,把這個在每一個細胞:

select 'x' as brand from dual union 

在C列,寫此公式,並複製它。

=REPLACE(A2,9,1,A1)

所有select/union報表應C.