0

我有个问题。我该如何编写这个 SQL

第一个表

  1. 名称:ORDER_TABLE
  2. 列:Order_number、Contract_number、vendor_number

第二张表

  1. 名称:CONTRACT_TABLE
  2. 列:合同编号、供应商编号

我有一个包含在 CONTRACT_TABLE 中的 contract_number ='1234' 但我想检查这个 contract_number 是否有订单。我想得到这个在 ORDER_TABLE 中没有 Order_number 的 Contract_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

4 回答 4

1
SELECT
    Contract_Number
FROM
    Contract_Table
WHERE
    NOT EXISTS
    (SELECT
         NULL
    FROM
         Order_Table
    WHERE
         Contract_Table.Order_Number = Order_Table.Order_Number)
于 2013-09-27T09:02:14.243 回答
1

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

select Contract_number from CONTRACT_TABLE
minus select distinct Contract_number from ORDER_TABLE
于 2013-09-27T09:02:26.963 回答
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 隐式连接语法的原因之一。这篇文章虽然主要是关于 SQL-Server 的,但确实列出了切换到更新样式连接语法的一些充分理由。

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

于 2013-09-27T09:02:48.480 回答
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
于 2013-09-27T09:10:05.153 回答