2017-12-29 14 views
2

同じ列名を持つ2つのテーブルがあります。例えば2つのテーブルからの不一致の列値の選択

NEEDTOSYNCREQUESTSテーブル

Column Name   Value 
---------------------------- 
ID     1 
LoadId    L1 
ShipmentId   123 
OrderId    NULL 
PackageId   P456 
CustomerOTP   99999 
ClientOTP   88888 

LASTSYNCEDREQUESTテーブル:

Column Name   Value 
------------------------- 
ID     1 
LoadId    L1 
ShipmentId   NULL 
OrderId    1234567 
PackageId   P456 
CustomerOTP   44444 
ClientOTP   686868 

あなたは上記の表の列valuesyを比較する場合は、以下を参照してくださいできます

  1. CustomerOTP & ClientOTP列の値が一致しません。
  2. NEEDTOSYNCREQUESTSのShipmentId列に値があり、LASTSYNCEDREQUESTテーブルのShipmentId列がNULLです。
  3. LASTSYNCEDREQUESTのOrderId列には値があり、NEEDTOSYNCREQUESTSにはShipmentId列があります。表はNULLです。

したがって、次の出力を取得する必要があります。これを達成する方法は?別のLASTSYNCEDREQUEST表と比較した場合

OUTPUT

Column Name   Value 
--------------------------------- 
ID     1 
LoadId    NULL 
ShipmentId   123 
OrderId    NULL 
PackageId   NULL 
CustomerOTP   99999 
ClientOTP   88888 

条件であるが、私は上記の二つのテーブルと必要なときだけ更新された列の値を比較する表をNEEDTOSYNCREQUESTS必要とします。注:両方の列が同じ値を持っているか、NEEDTOSYNCREQUESTS表の列に値がない場合、それらの列は出力でヌルにする必要があります。両方のテーブルのPackageIdは同じ(同じ)です。だから、私はPackageIdを出力にNULLにする必要があります。

SQLクエリでこれを達成するのを手伝ってください。

ありがとうございます!

+0

最後の2つのフィールドはどうですか? PackageidはどのようにNULLになりましたか? – Vashi

+0

これまでに何を試みましたか?その結果は何ですか? – Devesh

+0

@Vashi Packageidは両方のテーブルで同じ(同じ)です。だから、出力でNULLになるようにPackageIdが必要です – Vignesh

答えて

1

ご覧のとおり、すべてのフィールドのCASE文で3つのWHENに同じルールが実装されています。

SELECT A.ID, 
CASE WHEN A.LOADID = B.LOADID THEN NULL 
    WHEN A.LOADID IS NULL THEN NULL 
    WHEN (B.LOADID IS NULL AND A.LOADID IS NOT NULL) OR (A.LOADID IS NOT NULL AND B.LOADID IS NOT NULL) THEN A.LOADID END AS LOADID, 
CASE WHEN A.SHIPMENTID = B.SHIPMENTID THEN NULL 
    WHEN A.SHIPMENTID IS NULL THEN NULL 
    WHEN (B.SHIPMENTID IS NULL AND A.SHIPMENTID IS NOT NULL) OR (A.SHIPMENTID IS NOT NULL AND B.SHIPMENTID IS NOT NULL) THEN A.SHIPMENTID END AS SHIPMENTID, 
CASE WHEN A.ORDERID = B.ORDERID THEN NULL 
    WHEN A.ORDERID IS NULL THEN NULL 
    WHEN (B.ORDERID IS NULL AND A.ORDERID IS NOT NULL) OR (A.ORDERID IS NOT NULL AND B.ORDERID IS NOT NULL) THEN A.ORDERID END AS ORDERID, 
CASE WHEN A.PACKAGEID = B.PACKAGEID THEN NULL 
    WHEN A.PACKAGEID IS NULL THEN NULL 
    WHEN (B.PACKAGEID IS NULL AND A.PACKAGEID IS NOT NULL) OR (A.PACKAGEID IS NOT NULL AND B.PACKAGEID IS NOT NULL) THEN A.PACKAGEID END AS PACKAGEID, 
CASE WHEN A.CUSTOMEROTP = B.CUSTOMEROTP THEN NULL 
    WHEN A.CUSTOMEROTP IS NULL THEN NULL 
    WHEN (B.CUSTOMEROTP IS NULL AND A.CUSTOMEROTP IS NOT NULL) OR (A.CUSTOMEROTP IS NOT NULL AND B.CUSTOMEROTP IS NOT NULL) THEN A.CUSTOMEROTP END AS CUSTOMEROTP, 
CASE WHEN A.CLIENTOTP = B.CLIENTOTP THEN NULL 
    WHEN A.CLIENTOTP IS NULL THEN NULL 
    WHEN (B.CLIENTOTP IS NULL AND A.CLIENTOTP IS NOT NULL) OR (A.CLIENTOTP IS NOT NULL AND B.CLIENTOTP IS NOT NULL) THEN A.CLIENTOTP END AS CLIENTOTP 
FROM 
NEEDTOSYNCREQUESTS A 
INNER JOIN 
LASTSYNCEDREQUEST B 
ON A.ID = B.ID; 
0

このお試しください:

SELECT n.ID, n.LoadId, n.ShipmentId, 
    n.OrderId, NULL PackageId, n.CustomerOTP, 
    n.ClientOTP 
FROM NEEDTOSYNCREQUESTS AS n 
INNER JOIN LASTSYNCEDREQUEST AS l ON n.ID = l.ID AND n.LoadId = l.LoadId 
WHERE n.CustomerOTP <> l.CustomerOTP AND 
     n.ClientOTP <> l.ClientOTP 
    AND n.ShipmentId IS NOT NULL 
    AND l.ShipmentId IS NULL 
    AND l.OrderId IS NOT NULL 
    AND l.ShipmentId IS NULL; 

SQL Fiddle Demo

| ID | LoadId | ShipmentId | OrderId | PackageId | CustomerOTP | ClientOTP | 
|----|--------|------------|---------|-----------|-------------|-----------| 
| 1 |  L1 |  123 | (null) | (null) |  99999 |  88888 | 

PackageIdがnullである必要があり、なぜあなたの基準に従って、それはいけないので、私は、理解していない、という注意を。とにかく、固定値NULLの値を選択するので、実際の値が何であっても常にNULLの値になります。

1

私は、多くの場合、データの抽出や統合を作成する際に、このようないくつかの事件を解決する必要が See live demo

select 
    id  = N.id, 
    Loadid = case 
       when ISNULL(N.Loadid,'')=ISNULL(L.Loadid,'') 
       then NULL 
       else N.LoadId 
       end, 
    Shipmentid=case 
       when ISNULL(N.Shipmentid,'')=ISNULL(L.Shipmentid,'') 
       then NULL 
       else N.Shipmentid 
       end, 
    orderid=case 
       when ISNULL(N.orderid,'')=ISNULL(L.orderid,'') 
       then NULL 
       else N.orderid 
       end, 
    packageid=case 
       when ISNULL(N.packageid,'')=ISNULL(L.packageid,'') 
       then NULL 
       else N.packageid 
       end, 
    customerOTP=case 
       when ISNULL(N.customerOTP,'')=ISNULL(L.customerOTP,'') 
       then NULL 
       else N.customerOTP 
       end, 
    clientOTP=case 
       when ISNULL(N.clientOTP,'')=ISNULL(L.clientOTP,'') 
       then NULL 
       else N.clientOTP 
       end 
from 
NEEDTOSYNCREQUESTS N LEFT JOIN 
LASTSYNCEDREQUEST L ON 
N.id=L.id 
0

以下のようなケースベースのクエリを試すことができます。

だから、私にとって答えはこれに近いものになります。

あなたは、いくつかの列

MERGE LASTSYNCEDREQUEST TGT 
USING (
SELECT 
    ID, 
    LoadId, 
    ShipmentId, 
    OrderId, 
    PackageId, 
    CustomerOTP, 
    ClientOTP 

FROM NEEDTOSYNCREQUESTS 
) AS SRC 
ON (
     SRC.ID = TGT.ID) 

WHEN MATCHED 
THEN 
    UPDATE 
    SET  
    TGT.ID = SRC.ID 
    ,TGT.LoadID = NULL 
    ,TGT.ShipmentID = SRC.ShipmentID 
    ,TGT.OrderID = NULL 
    ,TGT.PackageID = NULL 
    ,TGT.CustomerOTP = SRC.CustomerOTP 
    ,TGT.ClientOTP = SRC.ClientOTP 


WHEN NOT MATCHED 
THEN 
    INSERT (

     ID, 
     LoadId, 
     ShipmentId, 
     OrderId, 
     PackageId, 
     CustomerOTP, 
     ClientOTP 

     ) 
    VALUES (
     SRC.ID, 
     NULL, 
     SRC.ShipmentId, 
     NULL, 
     NULL, 
     SRC.CustomerOTP, 
     SRC.ClientOTP 

     ); 

SELECT * FROM LASTSYNCEDREQUEST 

のカスタムにそれをしたい場合は、できるMERGE機能を使用すると、いくつかのスイッチケースを追加することができます上記のコードを試してみてください。

関連する問題