另一个表中不存在的订单号

时间:2013-09-27 08:44:29

标签: sql oracle

我有一个问题。我该怎么写这个SQL

第一张表

  1. 姓名:ORDER_TABLE
  2. 列:Order_number,Contract_number,vendor_number
  3. 第二张表

    1. 姓名:CONTRACT_TABLE
    2. 列:Contract_number,vendor_number
    3. 我有一个contract_number ='1234',其中包含CONTRACT_TABLE但我想检查此contract_number是否有订单。我想得到这个Contract_number得分,它在ORDER_TABLE中没有Order_number

      SELECT ct.VENDOR_NUMBER, ct.CONTRACT_NUMBER, ot.ORDER_NUMBER
      FROM CONTRACT_TABLE ct,
           ORDER_TABLE ot
      WHERE ct.vendor_number = ot.vendor_number
      

4 个答案:

答案 0 :(得分:1)

SELECT
    Contract_Number
FROM
    Contract_Table
WHERE
    NOT EXISTS
    (SELECT
         NULL
    FROM
         Order_Table
    WHERE
         Contract_Table.Order_Number = Order_Table.Order_Number)

答案 1 :(得分:1)

假设您要检测CONTRACT_TABLE中没有退出ORDER_TABLE的所有Contract_number(从您的描述中不清楚),这里有一个例子:

select Contract_number from CONTRACT_TABLE
minus select distinct Contract_number from ORDER_TABLE

答案 2 :(得分:1)

您需要使用LEFT JOIN

SELECT ct.VENDOR_NUMBER, ct.CONTRACT_NUMBER, ot.ORDER_NUMBER
FROM CONTRACT_TABLE ct
     LEFT JOIN ORDER_TABLE ot
        ON ct.vendor_number = ot.vendor_number

然后,如果ORDER_TABLE中没有相应的记录,您仍会收到合同详细信息,但ORDER_NUMBER列会返回NULL

如果您只想在没有订单的情况下退回合约,那么您可以添加一个where子句来过滤:

WHERE ot.ORDER_NUMBER IS NULL

这是为什么切换到较新的ANSI 92 JOIN语法而不是您正在使用的旧版ANSI 89隐式连接语法的原因之一。 This article,虽然主要是关于SQL-Server确实列出了一些很好的理由来切换到更新的样式连接语法。

注意 - 在某些罕见的情况下,Oracle会比显式连接更好地优化隐式连接,但这些是规则的例外,几乎所有两个方法都会生成相同的计划

答案 3 :(得分:0)

DECLARE @ORDER_TABLE
TABLE ( ORDER_NUMBER INT, CONTRACT_NUMBER INT ,VENDOR_NUMBER INT)

DECLARE @CONTRACT_TABLE TABLE
(CONTRACT_NUMBER INT , VENDOR_NUMBER INT)


SELECT 
    C.CONTRACT_NUMBER , 
    COUNT(ORDER_NUMBER)  AS ORDER_SCORE
FROM 
    @ORDER_TABLE O
RIGHT OUTER JOIN
    @CONTRACT_TABLE C ON C.CONTRACT_NUMBER = O.CONTRACT_NUMBER
GROUP BY C.CONTRACT_NUMBER
HAVING COUNT(O.ORDER_NUMBER)= 0