簡體   English   中英

Oracle SQL-比較同一表中的鍵和值

[英]Oracle SQL - Compare key and values in the same table

(還原編輯)我有一個表,其中包含不同客戶的鍵和配置值。

CustomerID    Key              Value
C1            AskPhoneNo       TRUE
C1            Website          C1Website.com
C1            Report           TRUE 
C2            AskPhoneNo       TRUE
C2            Report           FALSE
C2            AskAddress       TRUE

我需要比較C1和C2之間的數據並像這樣顯示差異

C1            AskPhoneNo       TRUE                C2    AskPhoneNo       TRUE
C1            Website          C1Website.com       C2      -               -
C1            Report           TRUE                C2    Report          False
C1            AskAddress       -                   C2    AskAddress   

可以使用什么查詢來獲得此結果?

所需的輸出有兩個問題。 首先,常量列中沒有意義(分別具有值C1和C2),也沒有理由重復鍵名。 其次,您的輸出似乎顯示所有行,而不僅僅是“差異”。 如果需要顯示所有行(值是相同還是不同),只需刪除下面的where子句。

with
  test_data(customer_id, key, value) as (
    select 'C1', 'AskPhoneNo', 'TRUE'          from dual union all
    select 'C1', 'Website'   , 'C1Website.com' from dual union all
    select 'C1', 'Report'    , 'TRUE'          from dual union all
    select 'C2', 'AskPhoneNo', 'TRUE'          from dual union all
    select 'C2', 'Report'    , 'FALSE'         from dual union all
    select 'C2', 'AskAddress', 'TRUE'          from dual union all
    select 'C3', 'AskAddress', 'FALSE'         from dual union all
    select 'C3', 'Report'    , 'TRUE'          from dual union all
    select 'C3', 'Website'   , 'C3web.edu'     from dual
  )
-- End of simulated inputs (for testing only, not part of the solution!)
select key, c1_value, c2_value
from   test_data
pivot  (max(value) for customer_id in ('C1' as c1_value, 'C2' as c2_value))
where  decode(c1_value, c2_value, 0, 1) = 1  -- If needed
order  by key                                -- If needed
;

KEY        C1_VALUE      C2_VALUE     
---------- ------------- -------------
AskAddress               TRUE         
Report     TRUE          FALSE        
Website    C1Website.com              

您可以使用full outer join + nvl

CREATE TABLE T
    ("CustomerID" varchar2(2), "Key" varchar2(10), "Value" varchar2(13));


INSERT ALL 
    INTO T ("CustomerID", "Key", "Value")
         VALUES ('C1', 'AskPhoneNo', 'TRUE')
    INTO T ("CustomerID", "Key", "Value")
         VALUES ('C1', 'Website', 'C1Website.com')
    INTO T ("CustomerID", "Key", "Value")
         VALUES ('C1', 'Report', 'TRUE')
    INTO T ("CustomerID", "Key", "Value")
         VALUES ('C2', 'AskPhoneNo', 'TRUE')
    INTO T ("CustomerID", "Key", "Value")
         VALUES ('C2', 'Report', 'FALSE')
    INTO T ("CustomerID", "Key", "Value")
         VALUES ('C2', 'AskAddress', 'TRUE')
SELECT * FROM dual;



select 
    nvl(T1."CustomerID",'C1') as CustomerID,
    nvl(T1."Key",T2."Key") as Key,
    T1."Value" as Value,
    nvl(T2."CustomerID",'C2') as CustomerID,
    nvl(T2."Key",T1."Key") as Key,
    nvl(T1."Key",null) as Value
 from (
     select  * from T where "CustomerID" = 'C1'
 ) T1
 full outer join (
     select  * from T where "CustomerID" = 'C2'
 ) T2
 on T1."Key" = T2."Key"
\n 客戶|  KEY |  值|  客戶|  KEY |       \n :--------- |  :--------- |  :------------ |  :--------- |  :--------- |  :---------\n C1 |  AskPhoneNo |  TRUE |  C2 |  AskPhoneNo |  問電話\n C1 |  報告|  TRUE |  C2 |  報告|  報告    \n C1 |  AskAddress |   |  C2 |  AskAddress |  空值      \n C1 |  網站|  C1Website.com |  C2 |  網站|  網站   \n

db <> 在這里撥弄

這是帶有參數化客戶ID的版本

with 
 Cust1 as (select 'C1' as C_id from DUAL)
,Cust2 as (select 'C2' as C_id from DUAL)
select (select C_id from Cust1) ID1,
       coalesce(t1.K, t2.K) Key1,
       t1.V as Value1,
       (select C_id from Cust2) ID2,
       coalesce(t2.K, t1.K) Key2,
       t2.V as Value2
 from 
 (select * from t where id = (select C_id from Cust1)) t1
   full outer join (select * from t where id = (select C_id from Cust2)) t2 
   on t1.k = t2.k

測試我用

with 
 Cust1 as (select 'C1' as C_id from DUAL)
,Cust2 as (select 'C2' as C_id from DUAL)
,t as (
select 'C1' ID, 'AskPhoneNo' K, 'TRUE' V union
select 'C1', 'Website', 'C1Website.com' union
select 'C1', 'Report',  'TRUE' union
select 'C2', 'AskPhoneNo', 'TRUE' union
select 'C2', 'Report', 'FALSE' union
select 'C2', 'AskAddress', 'TRUE')
select (select C_id from Cust1) ID1,
       coalesce(t1.K, t2.K) Key1,
       t1.V as Value1,
       (select C_id from Cust2) ID2,
       coalesce(t2.K, t1.K) Key2,
       t2.V as Value2
 from 
 (select * from t where id = (select C_id from Cust1)) t1
   full outer join (select * from t where id = (select C_id from Cust2)) t2 
   on t1.k = t2.k

您是否只比較兩個客戶之間的數據?

Select 
    cust1, key1, val1,
    cust2, key2, val2      
from
    (select CustomerID cust1, key key1, value val1
     from myTable
     where CustomerID = 1) c1 inner join 
    (select CustomerID cust2, key key2, value val2
     from myTable
     where CustomerID = 2) c2 on 
        c1.key1 = c2.key2;

希望這是不言而喻的。 但是,僅當您具有cust1和cust2值時,此特定的SQL才有效。 如果其中一些缺少,我們需要使用左右聯接,或FULL JOIN

為了比較所有客戶,首先將客戶加入客戶。 交叉聯接所有鍵。 然后外部加入數據:

with customers as (select distinct customerid from mytable)
select
  k.key,
  c1.customerid as customerid1, m1.value as value1,
  c2.customerid as customerid2, m2.value as value2
from customers c1
join customers c2 on c2.customerid > c1.customerid
cross join (select distinct key from mytable) k
left join mytable m1 on m1.customerid = c1.customerid and m1.key = k.key
left join mytable m2 on m2.customerid = c2.customerid and m2.key = k.key
order by customerid1, customerid2, k.key;

(我想您有一個customers表,因此您可以刪除WITH子句。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM