MS Access SQL-基于重复列值和额外条件创建“标志”列
这是我的原始表格:MS Access SQL-基于重复列值和额外条件创建“标志”列,sql,vba,ms-access,countif,Sql,Vba,Ms Access,Countif,这是我的原始表格: 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以排除记录 理想情况下,我希望创建一个附加的标志列来填充要排除的记录的值True,因为稍后可能会有进一步的排除条件 在具有相同名称的记录中: 1他们的组是1或2 2他们的年
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以排除记录
理想情况下,我希望创建一个附加的标志列来填充要排除的记录的值True,因为稍后可能会有进一步的排除条件
在具有相同名称的记录中:
1他们的组是1或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
非常感谢。类似的内容应该会为您提供要标记的列表,您可以从中创建更新
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
-更新以显示。。。更新语句。。。我讨厌那些双关语。
-有一种更好的方法可以做到这一点,但不允许访问。。。我很难想出正确的语法
-使用&to contat我不记得Access是否使用+或&
-Where子句需要,或者您将空白年龄设置为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)
嗯。我在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,但这与更新数据无关
我正在寻找其他解决方案
作为旁白。。。名称和组对于实际表列来说是糟糕的名称。您应该避免在列名和许多其他位置使用保留字: 这听起来有点像家庭作业。。。无论如何您有哪些数据类型列?年龄是文本列还是数字列?使用blank时,您打算使用NULL吗?这不是家庭作业,只是对SQL比较陌生,所以需要一些想法。年龄是数字,银行是空的,但我认为这对答案没有多大影响。谢谢,非常感谢!为了更简单,我想首先为重复的Paul列设置标志,但代码返回一个错误:更新set A.Flag=True,从按名称从tblTest GROUP按名称选择名称,计数>1 T内部连接tblTest A ON T.Name=A.Name但此SELECT查询工作正常:选择A.Name,A.Age,A.从中选择名称从tblTest按名称分组计数>1 T内部连接tblTest A在T上。名称=A。名称您能给我一些指针吗?谢谢,很抱歉,对SQL来说这是一个相当新的概念。这里的问题是名字不是一个足够的键,你需要去掉名字和年龄,否则你的空白pauls将是真实的。我的MS Access知识已经15岁以上了,所以去掉它是一个挑战。我不确定你是否能像上面列出的那样进行更新。我已经修改了我的回复,以获得更新声明。同样,它可能会起作用;也可能不是。