2013-09-27 23 views
0

我有一个问题。我怎么能写这个SQL订单号存在于其他表

首先表

  1. 名称:ORDER_TABLE
  2. 栏:ORDER_NUMBER,Contract_number,vendor_number

二表

  1. 名称:CON TRACT_TABLE
  2. 柱:Contract_number,vendor_number

我有一个contract_number = '1234' 包含在CONTRACT_TABLE但我要检查这是否contract_number有秩序。我希望得到这个分数Contract_number这可是没有ORDER_NUMBER在ORDER_TABLE

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

这样,你才有SQL,是吧? –

回答

1

假设你想检测所有Contract_number在CONTRACT_TABLE不中ORDER_TABLE(而不是从你的描述清楚)这里退出是一个为例ofsql :

select Contract_number from CONTRACT_TABLE 
minus select distinct Contract_number from ORDER_TABLE 
+0

其对我来说最好:)谢谢U – Przemek

+0

无后顾之忧。只要确保Contract_number是任一表上的主键或索引列以避免任何性能问题。 – Farid

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

您需要使用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将优化的隐式连接比显式的好加入,但这些都是例外,几乎所有的时间这两种方法都会产生同样的计划

+1

Btw:Oracle建议在手册中特别针对外连接使用明确的'JOIN'(并停止使用'(+)'运算符) –

+0

指向手册@a_horse_with_no_name手册中部分的链接指的是这里 - http: //docs.oracle.com/cd/E11882_01/server.112/e26088/queries006.htm#sthref2257 – GarethD

+0

感谢U :)它的确定 – Przemek

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 
+1

这对于Oracle来说是无效的SQL –

+0

*这是针对MSSQL SERVER的。谢谢。 –

+1

正确(仅限SQL Server **)。那么为什么你把这个问题发布到与Oracle相关的问题上呢? –