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的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:案例语句

在试听中如何用SQL选中从表选取所有列

如何修复此 SELECT 语句中的错误 INTO 子句

SQL SELECT 语句

SQL SELECT 语句

SQL的select语句