查询中的SQL选择字段不影响查询结果

Posted

技术标签:

【中文标题】查询中的SQL选择字段不影响查询结果【英文标题】:SQL Select Field in Query Without Affecting Query Results 【发布时间】:2013-07-12 16:21:50 【问题描述】:

我正在尝试运行查询,以查找每个客户和零件的最新 PRICE。我的参数是 This_Customer、This_Part 和 This_Date。任何留空的参数都应返回该字段的所有值。

表 1

ID  |  Customer  |  Part  |  BegDate   |  Price
101    1            A        1/1/2013     $1
102    2            A        2/1/2013     $2
103    2            A        3/1/2013     $3
104    1            B        4/1/2013     $4
105    2            B        5/1/2013     $5

通过运行以下两个查询,我已经能够为每个客户、部件和日期找到合适的记录,但它只有在我排除价格的情况下才有效。

第一个查询使用具有

查询 1“DaysSinceQuery”:

SELECT DateDiff("d",This_Date,BegDate) AS DaysSince, Table1.Part, Table1.Customer, Table1.BegDate, Table1.Price, Table1.ID
FROM Table1
WHERE (((DateDiff("d",This_Date,BegDate))<=0) AND ((Table1.Part) Like IIf(This_Part<>"",This_Part,"*")) AND ((Table1.Customer) Like IIf(This_Customer<>"",This_Customer,"*")));

第二个查询使用 Max 函数从 This_Date 中查找天数最少的记录(负 DaysSince 值最接近或等于零)。

查询 2“NearestDateQuery”:

SELECT Max(DaysSinceQuery.DaysSince) AS NearestDate, Table1.Part, Table1.Customer
FROM Table1 INNER JOIN DaysSinceQuery ON Table1.ID = DaysSinceQuery.ID
GROUP BY Table1.Part, Table1.Customer;

如何在不影响 NearestDateQuery 结果的情况下将 Table1.Price 值添加到 NearestDateQuery?似乎应该有一个简单的解决方案,但我就是不明白。

为进一步清楚起见,以下是该查询应如何工作的大量示例。

感谢您的帮助!

QUERY EXAMPLE 1
This_Customer     2
This_Part         A
This_Date         2/15/2013

ID  |  Customer  |  Part  |  BegDate   |  Price
102    2            A        2/1/2013     $2


QUERY EXAMPLE 2
This_Customer     NULL
This_Part         A
This_Date         2/15/2013

ID  |  Customer  |  Part  |  BegDate   |  Price
102    2            A        2/1/2013     $2


QUERY EXAMPLE 3
This_Customer     2
This_Part         NULL
This_Date         5/15/2013

ID  |  Customer  |  Part  |  BegDate   |  Price
103    2            A        3/1/2013     $3
105    2            B        5/1/2013     $5


QUERY EXAMPLE 4
This_Customer     2
This_Part         A
This_Date         NULL

ID  |  Customer  |  Part  |  BegDate   |  Price
102    2            A        2/1/2013     $2
103    2            A        3/1/2013     $3


QUERY EXAMPLE 5
This_Customer     NULL
This_Part         A
This_Date         NULL

ID  |  Customer  |  Part  |  BegDate   |  Price
101    1            A        1/1/2013     $1
102    2            A        2/1/2013     $2
103    2            A        3/1/2013     $3


QUERY EXAMPLE 6
This_Customer     NULL
This_Part         NULL
This_Date         4/15/2013

ID  |  Customer  |  Part  |  BegDate   |  Price
103    2            A        3/1/2013     $3
104    1            B        4/1/2013     $4


QUERY EXAMPLE 7
This_Customer     2
This_Part         NULL
This_Date         NULL

ID  |  Customer  |  Part  |  BegDate   |  Price
102    2            A        2/1/2013     $2
103    2            A        3/1/2013     $3
105    2            B        5/1/2013     $5

【问题讨论】:

这是哪个 RDBMS?查询语法与我见过的任何东西都不完全匹配,尽管与 SQL server 非常相似。 Joachim,我在 Access 中执行此操作。我查看了我的帖子,发现一些错字不在我在 Access 中的原始 SQL 代码中。错字现已更正。很抱歉这个错误。我的问题仍然存在。 【参考方案1】:

我会使用“指针”查询来获取每个客户和零件的最近日期(在这种情况下,我只是通过使用 Date() 函数来使用今天的日期,但您可以将其设为变量):

SELECT Table1.Customer, Table1.Part, Max(Table1.BegDate) AS MaxOfBegDate
FROM Table1
GROUP BY Table1.Customer, Table1.Part
HAVING (((Max(Table1.BegDate))<=Date()));

您可能必须更改 HAVING 子句以包含 Part 和 Customer。

然后将该指针连接到您的原始表格,以输入正确日期的 ID 和价格:

SELECT Table1.ID, Table1.Customer, Table1.Part, Table1.BegDate, Table1.Price
FROM Query1 INNER JOIN Table1 ON (Query1.MaxOfBegDate = Table1.BegDate) AND (Query1.Part = Table1.Part) AND (Query1.Customer = Table1.Customer);

【讨论】:

约翰尼,谢谢!我在 Part 和 Customer 的第二个查询中添加了 WHERE 子句,它运行良好。事后看来,我在第一个查询中使用 WHERE 而不是 HAVING 时出错了。如果以后查看这篇文章的人想了解更多关于 WHERE 与 HAVING 的信息,请阅读我在以下链接中找到的帖子。 ***.com/a/9253267/2577090

以上是关于查询中的SQL选择字段不影响查询结果的主要内容,如果未能解决你的问题,请参考以下文章

Informix SQL - 简单选择查询返回意外结果

如何从 Pentaho-Kettle 中基于动态选择的 sql 查询中获取结果集?

我无法将 SQL 选择查询结果转换为位

SQL高级子选择查询

sql查询原理

从列表框选择访问不可见的查询字段