【问题标题】:Access 97 Outer join issueAccess 97 外部连接问题
【发布时间】:2012-04-13 18:54:39
【问题描述】:

我有两个要加入的表。

表 A 有一列,名为“周”,包含 52 行:1、2、3、4、5、6 等。 表 2 有 3 列,分别命名为“Name”、“Week”和“Total”,包含 10 行:

'Bob', 1, 1
'Bob', 3, 1
'Joe', 4, 1
'Bob', 6, 1

我想将这些连接在一起,以便我的数据如下所示:

NAME|WEEK|TOTAL
'Bob', 1, 1
'Bob', 2, 0
'Bob', 3, 1
'Bob', 4, 0
'Bob', 5, 0
'Bob', 6, 1

如您所见,一个简单的外连接。但是,当我尝试这样做时,无论我使用哪种联接,我都没有得到预期的结果。

我的查询如下:

SELECT a.WEEK, b.Total
FROM Weeks a LEFT JOIN Totals b ON (a.Week = b.Week and b.Name ='Bob')

这个查询的结果是

NAME|WEEK|TOTAL
'Bob', 1, 1
'Bob', 3, 1
'Bob', 6, 1

提前感谢您的帮助!

【问题讨论】:

  • 您没有指定示例数据中的那些列。
  • @JNK - 不敢相信我们在 2012 年
  • @JonH 已添加...是的,Access 97。不幸的是,我坚持使用它(如果可以的话,我会升级!)
  • 你期待什么? (嗯,我已经听过这句话了,是吗?)
  • @Mansfield 我刚刚查看了您的访问查询。改成这样:

标签: sql ms-access join


【解决方案1】:

我知道它的访问权限,但您的加入不正确。这里我们进入sql server..同样的概念只看连接条件:

--dont worry about this code im just creating some temp tables

--table to store one column (mainly week number 1,2..52)
CREATE TABLE #Weeks
(
  weeknumber int
)

--insert some test data
--week numbers...I'll insert some for you
INSERT INTO #Weeks(weeknumber) VALUES(1)
INSERT INTO #Weeks(weeknumber) VALUES(2)
INSERT INTO #Weeks(weeknumber) VALUES(3)
INSERT INTO #Weeks(weeknumber) VALUES(4)
INSERT INTO #Weeks(weeknumber) VALUES(5)
INSERT INTO #Weeks(weeknumber) VALUES(6)

--create another table with two columns storing the week # and a total for that week
CREATE TABLE #Table2
 ( 
  weeknumber int,
  total int
 )

--insert some data
INSERT INTO #Table2(weeknumber, total) VALUES(1, 100)
--notice i skipped week 2 on purpose to show you the results
INSERT INTO #Table2(weeknumber, total) VALUES(3, 100)

--here's the magic
SELECT t1.weeknumber as weeknumber, ISNULL(t2.total,0) as total FROM 
#Weeks t1 LEFT JOIN #Table2 t2 ON t1.weeknumber=t2.weeknumber

--get rid of the temp tables
DROP TABLE #table2
DROP TABLE #Weeks

结果:

1   100
2   0
3   100
4   0
5   0
6   0

拿你的周数表(只有一列的表:

SELECT t1.weeknumber as weeknumber

添加一个空检查以将空值替换为 0。我认为访问中有类似 ISNULL 的东西:

ISNULL(t2.total, 0) as total

然后从您的第一个表开始您的联接,并在 weeknumber 字段中左联接到您的第二个表。结果很简单:

SELECT t1.weeknumber as weeknumber, ISNULL(t2.total,0) as total FROM 
#Weeks t1 LEFT JOIN #Table2 t2 ON t1.weeknumber=t2.weeknumber

不要关注我发布的所有其他代码,它们只是用于创建临时表并将值插入表中。

【讨论】:

  • @Mansfield:听起来你的实际数据有问题,检查你的周数表,确保你有你期望的数字。只需从该表中进行选择并发布即可。然后从另一张桌子上转储并发布。使用我发布的完全相同的语法将两者结合在一起。在您的帖子中向我们展示这些内容。
  • 我真的很确定我的数据没问题 - 我已经检查了好几次了。如果我在 SQL Server 中运行您的查询,它可以正常工作,但不能访问。
  • @Mansfield 我刚刚在 Access 2010 中运行了同样的东西,它运行得非常好。当然,我将它从使用临时表更改为常规表。但它回来了:SELECT t1.Field1 as weeknumber, IIF(ISNULL(Field2),0,Field2) as total FROM Weeks t1 LEFT JOIN Table2 t2 ON t1.Field1=t2.Field1
  • @JohH Access 2010 有很多 access 97 没有的功能。我也没有提到我也有一个过滤器(见下面的答案)
  • @Mansfield 好吧,你必须承认我付出了努力:)。
【解决方案2】:
SELECT b.Name, b.Week, b.Total
  FROM Totals AS b 
 WHERE b.Name ='Bob'
UNION
SELECT 'Bob' AS Name, a.Week, 0 AS Total
  FROM Weeks AS a 
 WHERE NOT EXISTS ( SELECT * 
                      FROM Totals AS b 
                     WHERE a.Week = b.Week
                           AND b.Name ='Bob' );

【讨论】:

    【解决方案3】:

    您在正确的轨道上,但只需要使用左连接。如果 total 为空,NZ 函数也会输入 0。

    SELECT Totals.Person, Weeks.WeekNo, Nz(Totals.total, 0) as TotalAmount
    FROM Weeks LEFT JOIN Totals 
    ON (Weeks.WeekNo = Totals.weekno and Totals.Person = 'Bob');
    

    编辑:您现在的查询甚至不会给出您显示的结果,因为您遗漏了 Name 字段(对于字段来说,这是一个错误的名称,因为它是一个保留字。)。您仍然没有提供所有信息。此查询有效。

    *另一种方法:* 在具有 where 子句的 Totals 表上创建一个单独的查询:Name = 'Bob'

    Select Name, WeekNo, Total From Totals Where Name = 'Bob';
    

    并将该查询替换为该查询中的 Totals 表。

    Select b.Name, w.WeekNo, b.total
    from Weeks as w 
    LEFT JOIN qryJustBob as b
    on .WeekNo = b.WeekNo;
    

    【讨论】:

    • 我确实有一个过滤器,但我没有提到 - 删除它可以让一切正常,不幸的是我需要它。我按照你的建议添加了它,但没有运气......
    • @Mansfield 你有过滤器是什么意思?您的意思是 WHERE 子句中的条件?请在问题中发布此信息以获得更好的帮助。
    • @JonH 我再次编辑以更好地反映我实际在做什么。
    • @Mansfield - 你为什么不从这个问题开始,你遗漏了很多改变一切的信息。您应该始终提供所有详细信息,以便获得正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2012-11-07
    相关资源
    最近更新 更多