使用子查询访问 2007 添加列

Posted

技术标签:

【中文标题】使用子查询访问 2007 添加列【英文标题】:access 2007 add column using sub query 【发布时间】:2013-04-18 17:18:09 【问题描述】:

我正在尝试将新表中的两列添加到我当前的查询结果中。像这样的东西:

在 SQL 中,我会执行以下操作:

选择 A.Clm1 ,A.Clm2 ,B.Clm3 ,(从 newTable NT 中选择 udf_number 其中 NT.udf_type_id=1 和 NT.id=A.id) 作为 NewColumn1 ,(选择 udf_number 来自 newTable NT,其中 NT.udf_type_id=2 和 NT.id=A.id)为 新列2 from TableA A inner join TableB B on A.id=B.id inner join newTable NT NT.id=A.id

甚至使用类似的情况

选择 A.Clm1 ,A.Clm2 ,B.Clm3 ,(当 NT.udf_type_id=1 然后 NT.udf_number 时的情况) 作为 NewColumn1,(情况 当 NT.udf_type_id=2 然后 NT.udf_number) 作为 NewColumn2 From..... ...

我在访问中尝试了一些事情,在 from 或 where 部分使用子查询。但没有取得任何成功。我的问题是我正在尝试根据新表中的 1 列添加两列。在 Access 中完成这项工作有什么帮助吗?

【问题讨论】:

【参考方案1】:

这对access97及以上有效(我猜)

Select A.Clm1, A.Clm2, B.Clm3,
NT1.udf_number as NewColumn1,
NT2.udf_number as NewColumn2
from 
TableA A 
inner join TableB B     on A.id=B.id 
left  join newTable NT1 on NT1.id=A.id and NT1.udf_type_id = A.id - A.id + 1
left  join newTable NT2 on NT2.id=A.id and NT2.udf_type_id = A.id - A.id + 2

请注意 Access 所需的棘手部分A.id - A.id + 1 对于其他 RDBM(或者可能是更新的访问版本),它可以是:

Select A.Clm1, A.Clm2, B.Clm3,
NT1.udf_number as NewColumn1,
NT2.udf_number as NewColumn2
from 
TableA A 
inner join TableB B     on A.id=B.id 
left  join newTable NT1 on NT1.id=A.id and NT1.udf_type_id = 1
left  join newTable NT2 on NT2.id=A.id and NT2.udf_type_id = 2

【讨论】:

我们为什么要做NT1.udf_type_id = A.id - A.id + 1 至少 access 97 会拒绝在等号两边都有缺失表的查询。如果这对于 2007 年的访问也是如此,我不知道。这是我经常使用的一个技巧。在这种情况下或在普通的 sintax(第二个查询)中,目的是过滤所需常量的连接。【参考方案2】:

加入newTable两次

在 SQL 中,它看起来像这样:

SELECT A.Clm1, ...
       NT1.udf_number AS NewColumn1, NT2.udf_number AS NewColumn2
  FROM A 
       INNER JOIN newTable NT1 ON A.id = NT1.id
       INNER JOIN newTable NT2 ON A.id = NT2.id
 WHERE NT1.udf_type_id = 1
   AND NT2.udf_type_id = 2
   AND ...

所以,基本上,你假装有两个不同的newTables:一个只有类型 1 条目,另一个只有类型 2 条目。然后你将两者都加入A

在 Access 查询设计器中,只需将表添加两次。 Access 可能会称它们为newTablenewTable1,您可能希望将其更改为更具描述性的名称。然后将NT1.udf_type_idNT2.udf_type_id 添加到列列表中,并添加过滤器值(分别为1 和2)。

(注意:这将只返回来自A 的记录,其中newTable 中的类型1 和类型2 记录都存在。如果要返回所有A,请使用LEFT JOIN 而不是INNER JOIN 将类型标准添加到连接条件。)

【讨论】:

谢谢。我了解sql版本。但是在 Access 中,如何根据 udf_type_id 返回/添加 udf_number。您的方法将使我将 udf_type_id 添加为列。 @camelbrush:您将两个udf_type_ids 添加到过滤器中——如果您不想在输出中显示它们,请删除该复选框。 另外udf_numbers 和 都添加到列列表中,并给它们起有意义的名称。 @camelbrush:哦,顺便说一句:如果您使用 SQL 比使用 Access 设计器更舒服,您可以使用左上角的工具栏按钮将设计器切换到 SQL 视图. 我确实切换了视图,只是由于某种原因,当我将 sql 代码粘贴到 access 时,它不起作用!我猜它不使用t-sql。我将尝试您的上述方法,如果它对我有用,我会回来发帖。谢谢。

以上是关于使用子查询访问 2007 添加列的主要内容,如果未能解决你的问题,请参考以下文章

子查询-列子查询

通过弹出子表单 (2) 添加新子表单 (1) 记录后重新查询子表单 (1) - Access 2007

mysql子查询

Oracle-查询,,..

SQL练习 高级子查询

子查询(章节摘要)