说我有一个普通的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调用,如果它甚至可以工作的话。有更好的方法吗?
答案 0 :(得分:0)
一种方法是使用基本逻辑创建视图:
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)
答案 1 :(得分:0)
我不这么认为。该表必须在查询中的某个地方有2个实例。您只需要确保它使用索引而不是进行全表扫描来完成比较。另一种方法是不存在而不是存在。我知道在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)