SQLITE:选择共享相同外键的所有项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLITE:选择共享相同外键的所有项目相关的知识,希望对你有一定的参考价值。

我是SQLSqlite的新手,我可能不会这样做,但是出于学术原因,我正在尝试用自己创建的脏数据库来学习基础知识。请原谅我,如果词汇不正确,我还在学习过程中。

我创建了一组表,每个表都有不同类型的实体,但它们都具有相似性:它们共享具有不同值的相同Foreign Key的多个事件。

表M1:包含2个项目的实体:

+------------+---------+--------+-------+
 Primary Key  Unique ID   Data1   Data2
+------------+---------+--------+-------+
      1          x1      103021   103022     

表M2:包含3个项目的实体:

+------------+---------+--------+-------+-------+
 Primary Key  Unique ID   Data1   Data2   Data3
+------------+---------+--------+-------+-------+
      1          y1      103021   103022  103001        

之前的所有数据列都是Foreign KeysUnique Key(表N):

+------------+---------+--------+-------+
 Primary Key  Unique ID   Data1   Data2
+------------+---------+--------+-------+
      1         100002     ...     ...
      2         103001     ...     ...
      3         103021     ...     ...
      4         103022     ...     ...

我需要做的就是提取共享给定唯一项目的所有实体(My Foreign Key)。例如,给定103022将给出两个实体:x1y1

现在我已经尝试了几天,我已经设法通过JOIN语句获得了我需要的一些信息。

内部联接:

SELECT N.id, T1.id FROM N INNER JOIN M1 as T1 on T1.data1=N.id OR T1.data2=N.id

交叉加入:

SELECT N.id, T1.id FROM N CROSS JOIN M1 as T1 WHERE T1.data1=N.id OR T1.data2=N.id

INNER JOIN只有在我一次使用一个表并使用python实时后处理时才能工作,我明白CROSS JOIN会生成我的数据的笛卡尔积,并且在我添加其他表时可以轻松使用太多内存布尔条件。所以我认为这不是一个选择。

还有其他方法我没想过吗?

谢谢你们!

答案

我想你正在寻找桌子的Union

SELECT N.id, T1.id FROM N INNER JOIN M1 as T1 on T1.data1=N.id OR T1.data2=N.id
Union
SELECT N.id, T1.id FROM N INNER JOIN M2 as T1 on T1.data1=N.id OR T1.data2=N.id

注意:考虑N作为主表和M1,M2是您要加入的其他表。

以上是关于SQLITE:选择共享相同外键的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

在片段中显示适当的 SQLite 数据(相同的条目出现在不同的选择条目中)

如何在 Sqlite 中将两列合二为一,同时获取外键的底层值?

表的 id 被外键的 id 替换

如何选择引用同一列作为外键的所有(表,列)

没有外键的NHibernate映射集合

在 SQLite 中启用外键约束