SQL Select 语句:如何从表“M”中获取所有值以及从表“T”中获取任何相关值,如果没有,则为 0
Posted
技术标签:
【中文标题】SQL Select 语句:如何从表“M”中获取所有值以及从表“T”中获取任何相关值,如果没有,则为 0【英文标题】:SQL Select Statement: How to get all values from Table 'M' and any correlating values from Table 'T' or 0 if nothing 【发布时间】:2010-10-26 20:50:10 【问题描述】:我正在尝试在使用 Access 作为其数据库 E2 Shop System 的商业 ERP 系统中创建查询。所以它只是通过 Access 运行查询。
我希望查询告诉我“在提示的日期每台机器上登录了多少时间,即使它是 0”。我已经想出了如何让它输出机器上有多少时间,但仅限于有时间的机器。
这是一个简化的例子:
表:M(机器)
Name | ID
------------
Saw | 1
Drill | 2
Weld | 3
Lathe | 4
Paint | 5
表格:T(时间)
Hours | Date | Name
-------------------------
8 | 10-25 | Weld
6 | 10-25 | Saw
10 | 10-25 | Lathe
2 | 10-01 | Drill
当提示输入日期 10-25 时,我想要的查询输出是:
Saw | 6
Drill | 0
Weld | 8
Lathe | 10
Paint | 0
我能想到的就是这个,它将输出限制在只有有时间对抗它们的机器上
SELECT M.name, T.time
FROM M, T
WHERE T.Date = [ENTER DATE POSTED (MM/DD/YY):]))
ORDER BY M.ID ;
我认为 CASE 可以提供帮助,但我无法让它发挥作用。
【问题讨论】:
【参考方案1】:WHERE语句排除日期为空的记录,时间表就是这种情况,所以需要加上Or Is Null。这可能会变得更复杂,根据您要返回的记录,您可能需要一个子查询。
SELECT M.Name, Nz([Hours],0) AS Hrs
FROM Machine AS M
LEFT JOIN [Time] AS T
ON M.Name = T.Name
WHERE T.Date=#10/25/2010# Or T.Date Is Null
ORDER BY M.ID;
我希望您没有真正的字段名称和时间表,因为这些是保留字。
编辑重新评论
SELECT m.Name, IIf(IsNull(ts.Hours),0,ts.Hours) AS Hrs
FROM Machine AS m
LEFT JOIN (
SELECT t.Name,t.Date,t.Hours
FROM [Time] AS T
WHERE T.Date=#10/25/2010#) AS ts
ON m.Name = ts.Name;
【讨论】:
你的权利,这些不是真实姓名,我只是认为这可能会让任何有类似问题的人变得容易。但是“T.Date IS NULL”只返回一台从未有时间针对它发布的机器。而且 Nz 功能无法识别,至少运行 access 数据库的 E2 软件无法识别。 正如我所说,您可能需要一个子查询,我已对其进行了编辑以显示这一点。我也调整了 Nz。 我可能把它复杂化了,试图让它变得更容易,但这是我正在尝试的,但它不起作用。这是您要说的吗?----------- SELECT m.ShortName, IIf(IsNull(ts.MachHrs),0,ts.MachHrs) AS Hrs FROM WorkCntr AS m LEFT JOIN ( Select t.WorkCntr, t.TicketDate, t.MachHrs FROM [TimeTicketDet] AS t WHERE T.TicketDate=DateValue(Now) AS ts ON m.WorkCntr = ts.WorkCntr; 乍一看似乎没问题,除了TicketDate=DateValue(Now)
,如果您不需要时间值,请使用TicketDate=Date()
。
我只使用了 DateValue(Now),因为我想让查询的其余部分首先工作,我知道它可以工作,因为向导会生成它。当我回到家时,我会将它插入 Access 本身,看看是否是 E2 不允许它。【参考方案2】:
使用左连接:
SELECT M.Name, COALESCE(T.time, 0)
FROM M
LEFT JOIN T
ON M.Name = T.Name AND T.Date = ...
ORDER BY M.Id
虽然我认为 Access 没有 COALESCE...您可以改用 Nz。
相关:
coalesce alternative in Access SQL【讨论】:
它可以在没有 COALESCE 或 Nz 的情况下工作但我无法让它与任何一个一起工作,因此我无法让它在其他机器上显示 0。万分感谢!不过,你在 3 分钟内就回答了。 我怀疑 Access 是否理解 CASE。你可以试试 IIF(isnull([fieldname],0,[fieldnanm]) Case 和 IIF 也不起作用。 “IIF”是否应该是“IF”,无论哪种方式都不起作用。感谢大家的帮助,今晚回家后我会尝试通过 Access 运行这些想法,E2 软件不喜欢它们。 Access 或 Jet/ACE SQL 中没有 If() 函数,但是有 IIf() 函数,所以@Harry Hood,我认为你错了。 @Mark Byers:当问题是关于 Access/Jet/ACE 时,请不要发布与 Access/Jet/ACE 不兼容的 SQL。 -1以上是关于SQL Select 语句:如何从表“M”中获取所有值以及从表“T”中获取任何相关值,如果没有,则为 0的主要内容,如果未能解决你的问题,请参考以下文章