2011-12-05 59 views
1

这是一个简单的问题,我开始使用SQL,并且遇到很多问题。如何使用JOIN将此VBA代码更改为SQL查询?

我有TBL_SALES和TBL_CUSTOMERS。两者都可以通过字段CUSTOMER_ID加入。 客户可能拥有CUSTOMER_ID,并且在TBL_CUSTOMERS上没有条目

我想修改TBL_SALES上没有TBL_CUSTOMERS条目的所有条目。

这一点我认为这是

SELECT UNIQUE TBL_SALES.CUSTOMER_ID, TBL_CUSTOMERS.CUSTOMER_ID 
FROM TBL_SALES, TBL_CUSTOMERS 
WHERE TBL_SALES.CUSTOMER_ID = TBL_CUSTOMERS.CUSTOMER_ID 

好相反......我可以与一个VBA代码使用SEEK和NOMATCH做。但我知道这不是生产力。如果我尝试使用此代码,这是行不通的:

SELECT UNIQUE TBL_SALES.CUSTOMER_ID, TBL_CUSTOMERS.CUSTOMER_ID 
FROM TBL_SALES, TBL_CUSTOMERS 
WHERE TBL_SALES.CUSTOMER_ID <> TBL_CUSTOMERS.CUSTOMER_ID 

我意识到必须有一个“SEEK”在SQL命令,但我敢肯定,是运行此查询的明智之选。

回答

5

尝试

SELECT * 
FROM TBL_SALES 
WHERE NOT EXISTS 
(SELECT * FROM TBL_CUSTOMERS 
WHERE TBL_CUSTOMERS.CUSTOMER_ID = TBL_SALES.CUSTOMER_ID) 

它也可以使用LEFT JOIN,它选择的“左”不管用是否有“右侧的”现有记录的所有记录。

SELECT * 
FROM TBL_SALES LEFT JOIN TBL_CUSTOMERS 
ON TBL_SALES.CUSTOMER_ID = TBL_CUSTOMERS.CUSTOMER_ID 
WHERE TBL_CUSTOMERS.CUSTOMER_ID IS NULL 
+0

击败我的胡须! – Simon

+1

您通常在Access中更好,所以我会选择2. – Fionnuala

+0

顺便说一句:我可以使用SELECT UNIQUE,这样我就不会有重复的CUSTOMER_ID字段了吗?还是没有必要? –

2

@Maarten van Leunen刚刚回答了我准备放的东西,所以我不再重复。我确实有一点我想要说明的是:您是否真的可以订购没有相关客户的订单?我不确定这是否是一个有效的用例(似乎不太可能),但如果不是,则需要调查数据库的完整性并开始执行一些外键关系。即,如果没有指向有效客户记录的链接,则无法保存订单记录。

+0

+1然而,可能有一个正当的理由,例如,跨柜台销售给一个身份不明的客户。 – Fionnuala

+0

这是交易,我只是编制了表名,以帮助确定我的问题。 我实际上运行一个VBA脚本来捕获约1000条每日SWIFT消息,我需要通过另一个表跨越经纪人的国民身份证(它有点像法定人的社会保险代码) 但我没有我的数据库中所有经纪人的完整列表。 所以我需要像我上面提到的filer,所以我可以在生成报告之前更新我的经纪人列表。 –

+0

@Remou,的确,这将是一个很好的例子。我想我仍然有一个通用的客户记录,但我会用这种方式。 – Simon