【问题标题】:Full Join on MS Access完全加入 MS Access
【发布时间】:2011-08-09 15:08:06
【问题描述】:

所以我尝试在 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;

错误:不支持连接表达式。第一段代码适用于左外连接。我尝试了两个左连接并且有效。它只是没有接受我的正确加入......

【问题讨论】:

  • 当未包含在 UNION ALL 查询中时,RIGHT JOIN 部分是否可以正常工作?
  • 您的字段列表包含表达式AS Balance,然后尝试在其他字段表达式中引用Balance:TotalWeight;和 TotalCF。把这两个放在外面,直到你让剩下的工作正常。如果错误消息具有误导性,那将是一种耻辱,而实际问题是数据库引擎对 Balance 是这个复杂的查询感到困惑。
  • @HansUp 感谢您的评论。我试过了,它仍然没有用,但是使用你的理由我去取出以前的内部连接并且它有效,我猜访问不能同时处理太多的连接?不太确定,但我会制作单独的视图,然后制作一个完整的视图,希望这足够简单,可以计算谢谢!

标签: sql ms-access ado.net


【解决方案1】:

您的最终目标是模拟 FULL OUTER JOIN,但您的第一个障碍是 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;

【讨论】:

  • 嗨,我试过了,但没用,我会编辑我的代码到我的帖子
【解决方案2】:

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

这是一个示例,其中我有人员和活动,我想让每个人都与每项活动相匹配:

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;

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多