没有主键的MS Access查询表

时间:2013-07-05 15:45:19

标签: sql ms-access

Claim# Total ValuationDt
  1     100     1/1/12
  2     550     1/1/12
  1     2000    3/1/12
  2     100     4/1/12
  1     2100    8/1/12
  3     200     8/1/12
  3     250     11/1/12

使用MS Access,我需要一个查询,该查询仅返回在该声明的生命周期中的某个时间点已被评估超过500美元的声明。在此示例中,查询应返回

Claim# Total ValuationDt
  1     100     1/1/12
  2     550     1/1/12
  1     2000    3/1/12
  2     100     4/1/12
  1     2100    8/1/12

因为索赔#1在3/1/12被评估超过500美元,索赔#2在1/1/12被评估为超过500美元,而索赔#3从未被评估超过500美元。

6 个答案:

答案 0 :(得分:5)

您可以使用IN

SELECT *
FROM Table1
WHERE Claim IN (SELECT Claim
                FROM Table1
                WHERE Total > 500)

Sql Fiddle Demo

答案 1 :(得分:2)

这应该有效

Select DISTINCT Claim FROM yourtable Where Total > 500

编辑:

如果我的初始答案不符合您的要求,那么您可以使用子查询。子查询是查询中的查询(嵌套查询)。我们必须这样做的原因是因为如果你使用类似

的东西
Select * FROM yourtable Where Total > 500

然后结果集只会是索赔总数高于500的那些时刻,但它不会表示其小于或等于500的其他时刻。

因此,正如其他人所说,您使用的子查询如下:

SELECT *
FROM Table1
WHERE Claim IN (SELECT Claim
                FROM Table1
                WHERE Total > 500)

注意:看到IN关键字后面有一个查询,所以我们有嵌套查询(或者你喜欢的子查询)。

为什么会这样?好吧,因为:

SELECT Claim
FROM Table1
WHERE Total > 500

将在某个时间点返回总数大于500的每项索赔(仅索赔的编号)。因此,此查询将返回1和2.如果在原始查询中替换它,则得到:

SELECT *
FROM Table1
WHERE Claim IN (1, 2)

这将为您提供索赔号等于1或2的每一行的每一列。

答案 2 :(得分:2)

试试这个:

Select * from table where claim in (Select claim from table where total > 500)

此处table是您表格的名称。

答案 3 :(得分:2)

这可能是解决方案

    SELECT distinct * 
    FROM YourTableName 
    WHERE claim# IN (SELECT DISTINCT claim#
                     FROM YourTableName
                     WHERE total > 500) 
    ORDER BY 3;

可选择按

排序

答案 4 :(得分:1)

您可以确定哪些[Claim#]值符合您的条件......

SELECT DISTINCT [Claim#]
FROM YourTable
WHERE [Total] > 500

如果这是正确的,请将其用作您INNER JOIN到您的表的子查询,以将结果集限制为仅这些声明。

SELECT y.[Claim#], y.[Total], y.[ValidationDt] 
FROM YourTable AS y
    INNER JOIN
        (
            SELECT DISTINCT [Claim#]
            FROM YourTable
            WHERE [Total] > 500
        ) AS sub
    ON y.[Claim#] = sub.[Claim#];

将此方法与IN()建议进行比较,看看您是否注意到执行速度有任何差异。

答案 5 :(得分:0)

你应该可以使用

  SELECT [Claim#],[Total],[ValidationDt] 
  FROM yourtable 
  WHERE [Claim#] IN (SELECT [Claim#] 
                     FROM yourtable 
                     WHERE Total >= 500)

对于任何ValidationDt,都应返回所有值> = 500。