优先处理不同的SQL查询

时间:2014-06-23 17:09:59

标签: sql sql-server vba

我正在尝试编写一个VBA Sql Query,它将返回不同的记录,但我希望能够优先处理它返回的不同记录。在这个测试示例中,我想要为每个ID返回一个不同的记录,优先考虑年份为Senior,然后是Junior,二年级和新生,然后根据C,A,然后B的顺序对该术语进行子优先级排序。

ID  Name    Term   Year
1   Suzy    A      Senior
1   Suzy    B      Junior
2   John    C      Senior
2   John    B      Sophomore
3   Pete    A      Junior
4   Carl    C      Freshman
5   Sally   B      Senior

在SQL查询中使用“Distinct”运算符时,我不知道它使用什么标准来决定返回哪条记录,或者是否可以像这样放置优先级。任何帮助将非常感激。我想我看到了一个使用“Select Case”的可能解决方案,但我并不太明白。如果这是正确的解决方案,我会很乐意使用它,但如果可能的话,我想解释它是如何工作的。

谢谢!

1 个答案:

答案 0 :(得分:1)

假设Y是一个订购“Year”列的辅助表:

Year      Order
--------- -----
Senior    1
Junion    2
Sophomore 3
Freshman  4

假设X是包含您的数据的表,并且所有行本身都是不同的(也就是说,X中没有记录,其中ID,Name,Term和Year是相同的),并且假设相同的ID意味着相同名称,反之亦然:

SELECT  x1.*
FROM    X x1
        INNER JOIN Y y1 ON (x1.year = y1.year)
WHERE   NOT EXISTS (
            SELECT  *
            FROM    X x2
                    INNER JOIN Y y2 ON (x2.year = y2.year)
            WHERE   x2.id = x1.id -- could also use "name" instead of id (as one implies the other)
                AND (
                        y2.order < y1.order
                    OR  (y2.order = y1.order AND x2.term < x1.term)
                    )
        )

修改

我会尝试通过简化(和概括)上述方案来澄清正在发生的事情。

您要完成的是选择一组输出行,每个输出行对于给定键是唯一的。根据一些排序标准,其他列应该来自相同的基础行(输入行)。

SELECT  *
FROM    YourTable t1
WHERE   NOT EXISTS (
            SELECT  *
            FROM    YourTable t2
            WHERE   t1.key = t2.key -- note that you can have composite keys connecting them with AND
                AND (
                    -- any ordering criteria that will give some sense of
                    -- this instance t2 is lesser (or have more priority) than
                    -- the candidate instance t1
                )
        )

(这是一个非常基本的概念;将其读作“获得这些行,因为每个行都没有任何其他类型,比它更小)

由于您的“年份”列没有自然排序,您的问题变得更加复杂,因此我们必须发明一个。

这就是这个metatable来自:将Year映射到某些排序。

现在你必须将上面解释的一般概念应用到你的扩充表(也就是你原来的一个用我建议的metatable)。

订购标准也有一个共同语言。因为您的订单有多个级别(“按此顺序,按此划分关系”),您使用以下一般结构:

    (t2.first_criteria < t1.first_criteria)
OR  (t2.first_criteria = t1.first_criteria AND t2.second_criteria < t1.second_criteria)
OR  (t2.first_criteria = t1.first_criteria AND t2.second_criteria = t1.second_criteria AND t2.third_criteria = t1.third_criteria)
...

(......任何其他类型,严格按照第一个标准,或者等于第一个,但严格小于第二个,或等于第一个和第二个,然后等于第三个......)