2015-06-16 27 views
0

我有2个表中有3列,假设它们具有相同的信息。 我想要一个查询,只选择没有完整的行匹配的行。下面是我想匹配2代表的例子:在SQL中查找2个表中不匹配的行

表1

ID FPRICE FPRODUCT 
    1  1  A 
    2  2  B 
    3  3  C 
    4  4  D 
    5  5  F 

表2

ID TPRICE TPRODUCT 
    1  1  A 
    2  2  B 
    3  3  C 
    4  5  D 
    6  6  E 

所需的输出:

ID FPRICE FPRODUCT TPRICE TPRODUCT 
    4  4  D   5   D 
    5  5  F   NULL  NULL 
    6  NULL  NULL  6   E 
+0

你需要一个完整的外连接 – artm

+0

假设他的RDBMS支持它。 MySQL不是例如。你在用什么? –

+0

此外,你是否说ID是保证匹配和价格和产品列可以有所不同? –

回答

1

更容易验证,如果我们建立一些DDL和填充样本数据,但我认为这会做到这一点。它通过完全连接来查找具有部分匹配的记录,然后使用完全匹配过滤掉记录。

sqlfiddle.com

CREATE TABLE Table1 (ID INT, FPRICE INT, FPRODUCT CHAR(1)) 
INSERT INTO Table1 (ID,FPRICE,FPRODUCT) VALUES 
    (1,  1,  'A') 
    ,(2,  2,  'B') 
    ,(3,  3,  'C') 
    ,(4,  4,  'D') 
    ,(5,  5,  'F') 


CREATE TABLE TABLE2 (ID INT, TPRICE INT, TPRODUCT CHAR(1)) 
INSERT INTO Table2 (ID,TPRICE,TPRODUCT) VALUES 
    (1,  1,  'A') 
    ,(2,  2,  'B') 
    ,(3,  3,  'C') 
    ,(4,  5,  'D') 
    ,(6,  6,  'E') 

SELECT * 
    FROM Table1 t1 
     FULL JOIN 
     Table2 t2 ON t1.ID = t2.ID 
       --EDIT: remove to exactly match the desired output 
       --OR t1.FPRICE = t2.TPRICE 
       --OR t1.FPRODUCT = t2.TPRODUCT 
WHERE NOT ( t1.ID = t2.ID 
      AND t1.FPRICE = t2.TPRICE 
      AND t1.FPRODUCT = t2.TPRODUCT) 
     OR ( COALESCE(t1.ID,t1.FPRICE,T1.FPRODUCT) IS NULL 
      OR COALESCE(t2.ID,t2.TPRICE,T2.TPRODUCT) IS NULL) 
+0

感谢Karl,您的解决方案能够正常工作。我会删除(OR t1.FPRICE = t2.TPRICE OR t1.FPRODUCT = t2.TPRODUCT)以获得我需要的输出。 –

+0

欢迎您。是的,我发现删除操作确实会使输出与您想要的结果相匹配。我误解了一下。 –

0

你可以试试这个查询?

SELECT DISTINCT t1.ID t1.FPRICE t1.FPRODUCT 
from Table1 t1 LEFT JOIN Table2 ON 
Table1.ID = Table2.ID AND Table1.FPRICE = Table2.TPRICE AND Table1.FPRODUCT= Table2.TPRODUCT 
WHERE 
Table1.ID is NULL or Table1.FPRICE is NULL or Table1.FPRODUCT is NULL 
or Table2.TPRICE is NULL or Table2.TPRODUCT is NULL 
0

使用full join

select * 
from Table1 t1 
full join Table2 t2 on t1.ID = t2.ID and 
         t1.FPRICE = t2.FPRICE /*and 
         t1.FPRODUCT = t2.FPRODUCT*/ 
where t1.ID is null or t2.ID is null 
0

它看起来像你想匹配的ID的,然后比较这两个值:

select t1.id, t1.fprice, t1.fproduct, t2.fprice, t2.fproduct 
from Table1 t1 full join 
    Table2 t2 
    on t1.ID = t2.ID 
where (t1.ID is null or t2.ID is null) or -- no match as all 
     (t1.FPRICE <> t2.FPRICE or 
     t1.FPRODUCT <> t2.FPRODUCT 
    ); 

where条款比较复杂,如果一个位列值可能为NULL,但您的示例数据没有任何NULL的示例。

0
SELECT * 
FROM Table1 t1 
FULL JOIN Table2 t2 ON t2.ID = t1.ID 
WHERE 
    t2.TPRICE <> t1.FPRICE 
    OR t2.TPRODUCT <> t1.FPRODUCT 
    OR t2.TPRICE IS NULL 
    OR t1.FPRICE IS NULL 
    OR t2.TPRODUCT IS NULL 
    OR t1.FPRODUCT IS NULL 
0

我会格式化从Michael1105答案为:

SELECT ISNULL(t1.ID,t2.ID),t1.FPRICE,t1.FPRODUCT,t2.TPRICE,t2.TPRODUCT FROM Table_1 t1 FULL JOIN Table_2 t2 ON t2.ID = t1.ID WHERE t2.TPRICE 
<>t1.FPRICE OR t2.TPRODUCT 
    <>t1.FPRODUCT OR t2.TPRICE IS NULL OR t1.FPRICE IS NULL OR t2.TPRODUCT IS NULL OR t1.FPRODUCT IS NULL 

为您的具体要求。

相关问题