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