2

我正在使用以下查询生成 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。我还能怎么做?

4

1 回答 1

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_IDfrom 该子查询。

LEFT JOIN在主查询中意味着它将返回所有行products...匹配的行firsthalf.product_ID加上不匹配的行。然后该WHERE子句过滤掉匹配项......只留下product与子查询行不匹配的行。

如果您products使用不同的名称保存,创建一个products仅包含几行的新名称,然后对查询进行试验,则可能更容易理解。丢弃该WHERE子句并将第一行更改为SELECT firsthalf.product_ID, secondhalf.product_ID.

于 2013-04-20T00:53:59.250 回答