所以我试图在MS Access 2003上进行完全加入,但发现它不支持它。所以我尝试使用我的两个select语句,然后使用LEFT join加入一个,并使用相同的语句创建一个UNION,但是使用RIGHT join。 Access给了我一个错误,说JOIN命令有问题。继承人一些sql ......
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 :(得分:1)
你的最终目标是模仿一个完整的外部联接,但你的第一个障碍是Access'数据库引擎抱怨你的LEFT JOIN尝试。你需要先创建一个可行的JOIN,我无法发现你提供的样本有什么问题。
Access是否接受此简化版本?
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;
答案 1 :(得分: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;