2011-08-09 33 views
3

所以我想在MS Access 2003上完全加入,但发现它不支持它。所以我尝试了两个select语句,然后使用LEFT连接并使用相同的语句创建一个UNION,但使用RIGHT连接。 Access给了我一个错误,说JOIN命令有问题。继承人一些SQL ...MS Access上的完全加入

SELECT tbl_Vendors.VendorName, tbl_Inventory.ItemNum, 
tbl_Inventory.Color, tbl_Inventory.InInventory, 
tbl_Inventory.OutInventory, 
(tbl_Inventory.Stocks + tbl_Inventory.InInventory - 
tbl_Inventory.OutInventory) AS Balance, 
tbl_Inventory.Weight, tbl_Inventory.CF, 
(tbl_Inventory.Weight *Balance) AS TotalWeight, 
(tbl_Inventory.CF * Balance) AS TotalCF, 
tbl_Inventory.NoteOrder, tbl_ItemHistory.orderDate, 
tbl_ItemHistory.POHistory, tbl_ItemHistory.InorOut, 
tbl_ItemHistory.Unit 
FROM (tbl_Vendors INNER JOIN tbl_Inventory 
    ON tbl_Vendors.vid = tbl_Inventory.VendorID) 
LEFT JOIN tbl_ItemHistory 
ON tbl_Inventory.ItemNum = tbl_ItemHistory.ItemNum 
ORDER BY tbl_Inventory.ItemNum, tbl_ItemHistory.orderDate 

对不起,如果这不是在代码格式,访问SQL我猜只是普通文本。这是只有左连接。如果你有任何想法,请说出来。谢谢!

编辑:2步加入,

SELECT tbl_Vendors.VendorName, tbl_Inventory.ItemNum, tbl_Inventory.Color, 
tbl_Inventory.InInventory, tbl_Inventory.OutInventory, 
(tbl_Inventory.Stocks+tbl_Inventory.InInventory-tbl_Inventory.OutInventory) AS Balance, 
tbl_Inventory.Weight, tbl_Inventory.CF, (tbl_Inventory.Weight*Balance) AS TotalWeight,  
(tbl_Inventory.CF*Balance) AS TotalCF, tbl_Inventory.NoteOrder, tbl_ItemHistory.orderDate, 
tbl_ItemHistory.POHistory, tbl_ItemHistory.InorOut, tbl_ItemHistory.Unit 
FROM (tbl_Vendors INNER JOIN tbl_Inventory ON tbl_Vendors.vid = tbl_Inventory.VendorID) LEFT JOIN 
tbl_ItemHistory ON tbl_Inventory.ItemNum = tbl_ItemHistory.ItemNum; 
UNION ALL 
SELECT tbl_Vendors.VendorName, tbl_Inventory.ItemNum, tbl_Inventory.Color, 
tbl_Inventory.InInventory, tbl_Inventory.OutInventory, 
(tbl_Inventory.Stocks+tbl_Inventory.InInventory-tbl_Inventory.OutInventory) AS Balance, 
tbl_Inventory.Weight, tbl_Inventory.CF, (tbl_Inventory.Weight*Balance) AS TotalWeight,  
(tbl_Inventory.CF*Balance) AS TotalCF, tbl_Inventory.NoteOrder, tbl_ItemHistory.orderDate, 
tbl_ItemHistory.POHistory, tbl_ItemHistory.InorOut, tbl_ItemHistory.Unit 
FROM (tbl_Vendors INNER JOIN tbl_Inventory ON tbl_Vendors.vid = tbl_Inventory.VendorID) RIGHT 
JOIN tbl_ItemHistory ON tbl_Inventory.ItemNum = tbl_ItemHistory.ItemNum; 

错误:不支持加入表达。第一段代码适合左外连接。我试了两个左连接,并工作。它只是没有采取我的权利加入...

+0

做正确的JOIN一件正常工作本身......当UNION不包括ALL查询? – HansUp

+1

您的字段列表包含一个表达式“AS Balance”,然后尝试在* other *字段表达式中引用Balance:TotalWeight;和TotalCF。把这两个放出去,直到其余的工作。如果错误信息是误导性的,并且实际的问题是数据库引擎对“Balance”感到困惑,这将是一个耻辱。 – HansUp

+0

@HansUp感谢您的评论。我试过这个,它仍然没有工作,但使用你的理由我去拿出以前的内部联接,它的工作,我想访问不能处理太多联合在一起?不太确定,但我会做出独立的意见,然后做出一个完整的,希望这将是足够简单的计算感谢! –

回答

1

您的最终目标是模仿全外连接,但您的第一个障碍是Access的数据库引擎抱怨你的左连接尝试。您需要先创建一个可行的JOIN,并且我无法发现您提供的示例有什么问题。

访问是否接受这个简化版本?

SELECT * 
FROM 
    (tbl_Vendors AS vend 
    INNER JOIN tbl_Inventory AS inv 
    ON vend.vid = inv.VendorID) 
    LEFT JOIN tbl_ItemHistory AS hist 
    ON inv.ItemNum = hist.ItemNum; 

就目前而言,我们并不关心字段列表或ORDER BY ...这简直查询是否工作没有错误,并返回正确的行。

如果确实有效,请参阅此RIGHT JOIN是否返回所需的其余行。

SELECT * 
FROM 
    (tbl_Vendors AS vend 
    INNER JOIN tbl_Inventory AS inv 
    ON vend.vid = inv.VendorID) 
    RIGHT JOIN tbl_ItemHistory AS hist 
    ON inv.ItemNum = hist.ItemNum 
WHERE inv.ItemNum Is Null; 

您可能需要更改WHERE子句;那是未经测试的空运码。但如果这也适用,将2个查询合并为一个:

SELECT * 
FROM 
    (tbl_Vendors AS vend 
    INNER JOIN tbl_Inventory AS inv 
    ON vend.vid = inv.VendorID) 
    LEFT JOIN tbl_ItemHistory AS hist 
    ON inv.ItemNum = hist.ItemNum 
UNION ALL 
SELECT * 
FROM 
    (tbl_Vendors AS vend 
    INNER JOIN tbl_Inventory AS inv 
    ON vend.vid = inv.VendorID) 
    RIGHT JOIN tbl_ItemHistory AS hist 
    ON inv.ItemNum = hist.ItemNum 
WHERE inv.ItemNum Is Null; 
+0

嗨,我试过这个,但它没有工作,我会编辑我的代码到我的文章 –

+0

为您的评论 –

0

我在两个表中的所有行上创建了一个具有相同值的虚拟列。
它可以在飞行中完成。

下面是一个例子,我有人民和活动,我希望让每一个与每一个活动匹配的人:

SELECT person, activity 
FROM (SELECT 1 as tag, person from person) AS a 
INNER JOIN (SELECT 1 as tag, activity from activity) AS b 
ON a.tag = b.tag 
ORDER BY person, activity;