【问题标题】:MS Access SQL - Create a "Flag" column based on duplicate column values and extra criteriaMS Access SQL - 根据重复的列值和额外条件创建“标志”列
【发布时间】:2014-06-07 04:53:24
【问题描述】:

这是我的原始表:

Name    Age Group
Paul    20  1
Paul    20  2
Paul    30  3
Paul    30  3
Paul        2
Paul        2
Joe     15  1
Mary    20  3

如何编写 MS Access SQL 以根据以下条件排除记录?

理想情况下,我想创建一个额外的“标志”列来填充值“真”以排除要排除的记录,因为我以后可能会进一步排除标准。

  1. 在具有相同“名称”的记录中:

    (1) 他们的“组”是 1 或 2

    (2) 他们的“年龄”相同但不是空白

  2. 对于具有唯一“名称”的记录,保持原样

在这种情况下,只会排除第一条和第二条记录。

更新:

@xQbert,非常感谢!

为方便起见,我想先为重复的“Paul”列设置标志,但代码返回错误:

UPDATE A
SET A.Flag = "True"
FROM
(
SELECT Name
FROM tblTest
GROUP BY Name
HAVING COUNT(*) > 1
    ) T INNER JOIN tblTest A ON T.Name = A.Name

但这很好用。

SELECT A.Name, A.Age, A.Group
FROM
    (
    SELECT Name
    FROM tblTest
    GROUP BY Name
    HAVING COUNT(*) > 1
    ) T INNER JOIN tblTest A ON T.Name = A.Name

非常感谢。

【问题讨论】:

  • 这听起来有点像家庭作业......无论如何......你有什么数据类型列?年龄是文本列还是数字列?空白你打算为NULL吗?
  • 这不是家庭作业,只是对 SQL 来说相当新,所以需要一些想法。年龄是数字,银行表示 NULL,但我认为这对答案并不重要。谢谢。

标签: sql vba ms-access countif


【解决方案1】:

这样的东西应该会给你一个你想要标记的列表,你可以从中创建更新......

SELECT [A].[name], [A].[Age], iif([A].[Group] =1,2,[A].[Group]) gp, count(*)
FROM Raw_table A
WHERE Age is not null and age <> ""
Group by [A].[name], [A].[Age], iif([A].[Group] =1,2,[A].[Group])
having count(*) > 1 

--更新以显示...更新声明...讨厌那些双字。 --有一个更好的方法可以做到这一点,但没有访问权限......我很难找出正确的语法。

--使用 & 来联系我不记得 Access 是使用 + 还是 & --whereclause 需要,否则您将空白年龄设置为 true...

UPDATE tblTest set SET A.Flag = "True"
WHERE Name&Age in (SELECT Name&Age
FROM tblTest
WHERE age is not null and age <> ""
GROUP BY Name&Age
HAVING COUNT(*) > 1)

【讨论】:

  • 非常感谢!为了方便起见,我想首先为重复的“Paul”列设置标志,但代码返回错误: UPDATE A SET A.Flag = "True" FROM ( SELECT Name FROM tblTest GROUP BY Name HAVING COUNT( ) > 1 ) T INNER JOIN tblTest A ON T.Name = A.Name 但是这个选择查询工作正常: SELECT A.Name, A.Age, A.Group FROM ( SELECT Name FROM tblTest GROUP BY Name HAVING COUNT( i>) > 1 ) T INNER JOIN tblTest A ON T.Name = A.Name 你能给我一些指点吗?谢谢,抱歉,对 SQL 来说还很陌生。
  • 这里的问题是名字不是一个足够的关键,你需要关闭名字和年龄(或者你的空白保罗将是真实的)我的 MS Access 知识已经 15 岁以上所以尘埃落定它关闭是一个挑战。我不确定您是否可以像列出的那样进行更新。我已经修改了我的回复以获得更新声明。它可能再次起作用;或者它可能不会。
【解决方案2】:

好的。我在 Access 2010 中执行此操作。

此查询返回您要排除的键:

SELECT Name, Age, Count(*) AS Occurs
FROM Data
WHERE Group In (1,2) AND Age Is Not Null
GROUP BY Name, Age
HAVING Count(*)>1;

我将它保存为“QueryExcludeKeys”。

要更新标志,我正在尝试这些查询:

UPDATE Data d, QueryExcludeKeys e
SET d.Flag=True
WHERE d.Name=e.Name AND d.Age=e.Age AND d.Group IN (1,2)

UPDATE Data d
SET d.Flag=(
   d.Group IN (1,2) AND
   EXISTS (
      SELECT * FROM QueryExcludeKeys e
      WHERE e.Name=d.Name AND e.Age=d.Age
   )

... 两者都不起作用。它声明它需要一个可更新的查询,这有点令人沮丧,因为我只需要更新数据表的一列。 QueryExcludeKeys 确实不可更新(它包含一个 GROUP BY),但这应该与更新 Data 无关。

我正在寻找其他解决方案。

顺便说一句...“名称”和“组”对于实际表列来说是糟糕的名称。您应该避免在列名和许多其他地方使用保留字。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2019-04-17
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多