有没有办法根据查询自己的结果排除查询的结果



假设我有一个正常的 SELECT 调用,例如(嗯,这个问题真的很简化):

SELECT * FROM table WHERE column_b = "X" and column_c = "Y"

但我还想排除column_a(主键)与任何其他匹配结果column_k匹配的结果。 我想我可以这样做(我还没有测试过这个,因为这不是我想要的方式)

SELECT * FROM table WHERE column_b = "X" AND column_c = "Y"
    AND column_k NOT IN
    (SELECT column_a FROM table WHERE column_b = "X" AND column_c = "Y")

作为 DRY 编程的大力倡导者,我不喜欢这种方法几乎重复整个 SELECT 调用,如果它甚至有效的话。 有没有更好的方法可以做到这一点?

一种方法是使用您的基本逻辑创建一个视图:

CREATE VIEW myview
AS 
SELECT *
FROM   mytable
WHERE  column_b = 'X' AND column_c = 'Y'

现在,可以重用此逻辑:

SELECT * 
FROM   myview
WHERE  column_a NOT IN (SELECT column_k FROM myview)

我不这么认为。 该表必须在某处的查询中有 2 个实例。 您只需要确保它利用索引而不是执行全表扫描即可完成比较。 另一种方法是不存在而不是in。 我知道这在MySQL中表现更好。 不确定它是否与 sql lite 有所不同。

SELECT * FROM table t1 WHERE column_b = "X" AND column_c = "Y"
    AND column_a NOT Exists
    (SELECT NULL FROM table t2 WHERE column_b = "X" AND column_c = "Y"  and t2.column_k = t1.column_a)

最新更新