我有一个问题。我该怎么写这个SQL
第一张表
第二张表
我有一个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
答案 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