在奇数行上使用TOP时重复行

时间:2013-04-19 22:22:59

标签: sql ms-access

我正在使用以下查询生成2个表单,每个表单显示表中的一半项目。这选择了上半部分:

SELECT TOP 50 PERCENT * FROM products
ORDER BY products.product_ID;

这会选择下半部分

SELECT TOP 50 PERCENT * FROM products
ORDER BY products.product_ID DESC;

显而易见的问题是,当项目为奇数时,中间项目将显示在两个表格上。 我尝试使用COUNT()函数以各种方式解决它,但它不适用于TOP。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

在定义前半部分时忽略奇数行。然后将后半部分定义为前半部分中不存在的行。您可以将子查询与IN()一起使用,但这样的LEFT JOIN方法可能会明显加快。

SELECT secondhalf.*
FROM
    products AS secondhalf
    LEFT JOIN
    (
        SELECT TOP 50 PERCENT product_ID
        FROM products
        ORDER BY product_ID ASC
    ) AS firsthalf
    ON secondhalf.product_ID = firsthalf.product_ID
WHERE firsthalf.product_ID Is Null;

子查询 firsthalf 与您问题中的第一个查询几乎相同。但在这种情况下,我们只需要来自该子查询的product_ID

主查询中的

LEFT JOIN表示它将返回products的所有行...匹配firsthalf.product_ID的行以及不匹配的行。然后WHERE子句过滤掉匹配...只留下与子查询行不匹配的product行。

如果您使用其他名称保存products,制作一个只包含几行的新products,然后尝试查询,则可能会更容易理解。放弃WHERE子句并将第一行更改为SELECT firsthalf.product_ID, secondhalf.product_ID