【问题标题】:get all records from TABLE_A that are not in TABLE_B and with a condition in TABLE_C从 TABLE_A 中获取不在 TABLE_B 中且条件在 TABLE_C 中的所有记录
【发布时间】:2016-06-06 16:41:03
【问题描述】:

基本上问题是

从 TABLE_A 中获取所有不在 TABLE_B 中且 [id] 对应于 TABLE_C 中字段 [type] 的记录

表格布局是这样的

TABLE_A
    id
    ref_id

TABLE_B
    id

TABLE_C
    id
    type

这是我的查询

SELECT * FROM TABLE_A t1
LEFT JOIN TABLE_B t2 ON t1.id = t2.id
WHERE t1.ref_id IN ['id1', #paramId]
AND type IN (SELECT id FROM TABLE_C WHERE type = #paramType)

它可能有效(虽然我没有测试)但我不喜欢那个内部select。 有没有办法使用joins 来避免它?

【问题讨论】:

  • Type 字段在哪个表中?

标签: sql


【解决方案1】:

您可以改用INNER JOIN

SELECT t1.* FROM TABLE_A t1
INNER JOIN TABLE_C t3
 ON(t1.type = t3.id and t3.type = #paramType)
LEFT JOIN TABLE_B t2
 ON (t1.id = t2.id)
WHERE  t2.id is null
   AND t1.ref_id IN ('id1', #paramId)

我添加了这个条件:

    WHERE  t2.id is null

过滤掉表3中存在的那些。

【讨论】:

  • 但真的需要过滤table_2 中的table_3 字段吗?
  • 什么意思?此查询选择表 3 中存在具有相同 id 和参数值的记录的所有位置,以及表 2 中不存在记录的位置。 @user1432980
  • 但不会在没有明确需要检查null 的情况下自行选择table_2 中不存在的所有记录?
  • 是的,但它也会选择所有确实存在的记录。那些不存在的将在ID 列上具有NULL 值,因此 - 条件。除非你也想要那些存在的人? @user1432980
  • 哦,我明白了。所以它会返回带有NULL ids的记录。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 2015-02-19
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多