Sql 查找不在另一个表中的记录,并且需要第三个表中的列

Sql 查找不在另一个表中的记录,并且需要第三个表中的列,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,好吧,假设我有三张表,如下所示: t1 t2 t3 --- --- --- id t3_id id name t1_id name value t1 t2 t3 ---- ------ -------- has_many :t2s belongs_to :t1 has_many :t2s belongs_to :t3

好吧,假设我有三张表,如下所示:

t1    t2     t3
---   ---    ---
id    t3_id  id
name  t1_id  name
      value
t1             t2               t3
----           ------           --------
has_many :t2s  belongs_to :t1   has_many :t2s
               belongs_to :t3
rails模型如下所示:

t1    t2     t3
---   ---    ---
id    t3_id  id
name  t1_id  name
      value
t1             t2               t3
----           ------           --------
has_many :t2s  belongs_to :t1   has_many :t2s
               belongs_to :t3
我想为每个t3.name创建一个行列表,该列表在t2和t1中没有对应的条目。因此,如果我们具备以下条件:

t1               t2                       t3
+----+------+    +------+------+-----+    +----+-------+
| id | name |    |t3_id | t1_id|value|    | id | name  |
+----+------+    +------+------+-----+    +----+-------+
| 1  | row1 |    |  1   |   1  |  a  |    |  1 | alpha |
+----+------+    +------+------+-----+    +----+-------+
| 2  | row2 |                             |  2 | beta  |
+----+------+                             +----+-------+
我想要阿尔法

t3.name  t1.name
-------  -------   
alpha    row2 
对于beta版,我希望:

t3.name  t1.name   
-------  -------  
beta     row1
beta     row2
如何使用活动记录方法执行此操作

更新

我得到了SQL,它将得到我想要的结果,但不确定如何将其放入活动记录中

SQL是

SELECT T1.name FROM T1 LEFT JOIN 
  (SELECT T2.t1_id FROM T3 JOIN T2 ON T3.id = T2.t3_id
   WHERE T3.id = <id>) AS existing ON T1.id = existing.t1_id
WHERE existing.t1_id IS NULL;
我也可以做到以下几点:

@settings = T3.find(<id>).t2s
T1.select(:name).where.not(id: @settings.map(&:t1_id)

假设您的模型是T1、T2和T3,T3对象是@T3:

T1.includes(:t2s).where.not(t2s: { t3_id: @t3.id }).references(:t2s)

t1.find1.t3。选择t1.name,t3.name将返回alpha的值。感谢您的回复。这只会帮助我获得“beta”缺失的内容。您不应该使用内部联接。这有用吗?同样的结果。我正在认真考虑在T2中折叠T1。我找到的唯一活动记录方式是在我的更新中。