2011-05-10 42 views
1

我有Visual Studio 2005,并且正在VB中编写代码,而不是C +。我需要一个Select语句,并找到一些接近但不符合我的情况。我有三个表:加入两个表格,然后从第三个表中拉出不匹配的记录

PROJECT 
    [Projnum] 
    [ShipDate] 

CUSTOMER 
    [Projnum] 
    [Jobnum] 

TAGS 
    [Jobnum] 

我需要加入客户和项目,所以我知道所有的CUSTOMER.Jobnum记录,其中PROJECT.ShipDate为空。在这些记录中,我需要从TAGS.Jobnum中找出哪些没有匹配的记录。

任何帮助将不胜感激。谢谢你,Chuck。

回答

0
SELECT c.Jobnum 
    FROM customer c 
     INNER JOIN project p 
      ON c.Projnum = p.Projnum 
    WHERE p.ShipDate IS NULL 
     AND NOT EXISTS(SELECT NULL FROM tags t WHERE t.Jobnum = c.Jobnum) 
0

如果我理解正确:

PROJECT 
    ProjNum 
    ShipDate 

CUSTOMER 
    ProjNum 
    JobNum 

TAGS 
    JobNum 

而且你希望所有未发货项目:

SELECT c.JobNUm 
FROM Project p 
    INNER JOIN Customer c 
    ON c.ProjNum = p.ProjNum 
WHERE p.ShipDate is null 

然后你想而不在标签表JobNum的那些:

SELECT c.JobNUm 
FROM Project p 
    INNER JOIN Customer c 
    ON c.ProjNum = p.ProjNum 
WHERE p.ShipDate is null 
    AND c.JobNum NOT IN (SELECT JobNum from TAGS) 

可以做得更简单,但我想展示我的作品。

0

A LEFT JOIN可能会快于NOT INNOT EXISTS

SELECT c.JobNUm 
FROM Project p 
    INNER JOIN Customer c 
    ON c.ProjNum = p.ProjNum 
    LEFT JOIN tags t ON t.jobnum=c.jobnum 
WHERE p.ShipDate is null AND t.jobnum IS NULL 
+0

'NOT EXISTS'应该更快。请参阅:[左外连接vs不存在](http://sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/) – 2011-05-10 20:35:21

+0

对于几个版本的Postgresql ,“不存在”表现不佳。我说*“可能会更快”*,因为相对速度取决于正在使用的数据库。我建议OP在预测JOIN,NOT EXISTS或NOT IN是否最快之前,在真实数据上运行他的RDBMS解释(或等价物)。 – 2011-05-10 20:42:01

相关问题