2016-06-27 1 views
0

Oracleデータベースを使用しているとします。表Aと表Bのデータの相違点

表Aに列の価格、価格リスト、通貨があります。 表Bには、価格、価格リスト、通貨、ステータスの列があります。

サンプルデータ:

Table A 

price, pricelist, currency 
123 , PL_10122016, EUR 
111 , PL_10122016, GBP 
141 , PL_10122016, USD 

Table B 

price, pricelist, currency,status 
123 , PL_10122016, EUR,0 
111 , PL_10122016, GBP,0 
143 , PL_10122016, USD,0 

私は

Expected Output : 
141 , PL_10122016, USD 

答えて

1

使用してマイナス左を使用して

WITH tablea (price, pricelist, currency) AS 
(SELECT 123 , 'pl_10122016', 'eur' FROM dual UNION ALL 
SELECT 111 , 'pl_10122016', 'gbp' FROM dual UNION ALL 
SELECT 141 , 'pl_10122016', 'usd' FROM dual) 
,tableb (price, pricelist, currency,status) AS 
(SELECT 123 , 'pl_10122016', 'eur',0 FROM dual UNION ALL 
SELECT 111 , 'pl_10122016', 'gbp',0 FROM dual UNION ALL 
SELECT 143 , 'pl_10122016', 'usd',0 FROM dual) 
SELECT price , pricelist , currency FROM tablea 
MINUS 
SELECT price , pricelist , currency FROM tableb; 

Result: 
PRICE PRICELIST CURRENCY 
141 pl_10122016 usd 

は、あなたがして同じことを行うことができます

WITH tablea (price, pricelist, currency) AS 
(SELECT 123 , 'pl_10122016', 'eur' FROM dual UNION ALL 
SELECT 111 , 'pl_10122016', 'gbp' FROM dual UNION ALL 
SELECT 141 , 'pl_10122016', 'usd' FROM dual) 
,tableb (price, pricelist, currency,status) AS 
(SELECT 123 , 'pl_10122016', 'eur',0 FROM dual UNION ALL 
SELECT 111 , 'pl_10122016', 'gbp',0 FROM dual UNION ALL 
SELECT 143 , 'pl_10122016', 'usd',0 FROM dual) 
SELECT a.* 
FROM tablea a 
LEFT JOIN tableb b 
    ON a.price = b.price AND a.pricelist = b.pricelist AND a.currency = b.currency 
    WHERE b.price IS NULL AND b.pricelist IS NULL AND b.currency IS NULL; 

Result: 
PRICE PRICELIST CURRENCY 
141 pl_10122016 usd 

に参加します右ジョイン、フル・アウト・ジョイン

+0

マイナスは何とか仕事をしません。 :-( – arjun

+0

私はいくつかのサンプルデータを追加しました。 – arjun

+0

が質問を更新しました。 – arjun

0

は、あなたが尋ねる前にstackoverflowのを検索しました表Bに存在しない表Aの行を見つけたいですか?すでに同様の質問に対する回答があります。 Take a look here

彼の解決策:

a1 <- data.frame(a = 1:5, b=letters[1:5]) 
a2 <- data.frame(a = 1:3, b=letters[1:3]) 

rows.in.a1.that.are.not.in.a2 <- function(a1,a2) 
{ 
    a1.vec <- apply(a1, 1, paste, collapse = "") 
    a2.vec <- apply(a2, 1, paste, collapse = "") 
    a1.without.a2.rows <- a1[!a1.vec %in% a2.vec,] 
    return(a1.without.a2.rows) 
} 
rows.in.a1.that.are.not.in.a2(a1,a2) 
0
Select A.price, A.pricelist, A.currency 
    FROM TableA A 
    LEFT JOIN TableB B 
     ON A.price = B.price 
     AND A.pricelist = B.pricelist 
     AND A.currency = B.currency 

あなたがテーブルA(マッチングと非マッチング)からTableBのからの行とすべての行に一致しているここまで。 followig条件は唯一の非一致する行に結果を減らします:

 WHERE B.price is NULL 
     AND B.pricelist is NULL 
     AND B.currency is NULL 
関連する問題