NOT IN子句中的组合键

时间:2019-05-17 04:57:36

标签: sql oracle

我有一个表,其中两列(Invoice_Id和Invoice_line)作为主键(复合键)。还有另一个具有类似结构的表。我想从表1中过滤掉不在表2中的数据。

类似于下面的查询

SELECT * 
   FROM INVOICE_LINE T1
   WHERE T1.INVOICE_ID AND T1.LINE
   NOT IN (SELECT T2.INVOICE_ID,T2.LINE
           FROM INVOICE_LINE2
           WHERE T1.INVOICE_ID = T2.INVOICE_ID
           AND   T1.LINE       = T2.LINE
);

我已经尝试了上述查询,但是无法正常工作。

4 个答案:

答案 0 :(得分:0)

尝试以下-

select * FROM INVOICE_LINE T1
   WHERE (T1.INVOICE_ID,T1.LINE)
   NOT IN (SELECT T2.INVOICE_ID,T2.LINE
           FROM INVOICE_LINE2)

或者您可以使用左联接

select * FROM INVOICE_LINE T1 
left join INVOICE_LINE2 T2 on T1.INVOICE_ID = T2.INVOICE_ID
           AND   T1.LINE= T2.LINE
where T2.INVOICE_ID is null

答案 1 :(得分:0)

不存在

 FROM INVOICE_LINE T1
   WHERE
   NOT exists (SELECT 1
           FROM INVOICE_LINE2
           WHERE T1.INVOICE_ID = T2.INVOICE_ID
           AND   T1.LINE       = T2.LINE
);

答案 2 :(得分:0)

或者,您可以使用LEFT JOIN

SELECT * 

FROM 
    INVOICE_LINE T1 
        LEFT JOIN INVOICE_LINE2 T2 ON T1.INVOICE_ID = T2.INVOICE_ID
        AND   T1.LINE= T2.LINE

WHERE
    T2.INVOICE_ID IS NULL OR T2.Line IS NULL

答案 3 :(得分:0)

您还可以使用minus运算符

因此,如果表2完全相同,则可以按如下所示编写SQL

SELECT * FROM INVOICE_LINE T1
MINUS
SELECT * FROM INVOICE_LINE2 T2