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

SQLITE:选择共享同一外键的所有项目,sql,sqlite,join,foreign-keys,Sql,Sqlite,Join,Foreign Keys,我对SQL和Sqlite非常陌生,我可能做得不对,但是出于学术原因,我正在尝试使用自己创建的脏数据库学习基础知识。如果词汇不正确,请原谅,我还在学习过程中 我创建了一组表,每个表具有不同类型的实体,但它们都具有相似性:它们共享具有不同值的相同外键的多个ocurrence 表M1:包含2项的实体: +------------+---------+--------+-------+ Primary Key Unique ID Data1 Data2 +------------+-----

我对
SQL
Sqlite
非常陌生,我可能做得不对,但是出于学术原因,我正在尝试使用自己创建的脏数据库学习基础知识。如果词汇不正确,请原谅,我还在学习过程中

我创建了一组表,每个表具有不同类型的实体,但它们都具有相似性:它们共享具有不同值的相同
外键的多个ocurrence

表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        
前面的所有数据列都是
外键
唯一键
(表N):

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

现在我已经尝试了几天,我已经通过
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
internal JOIN
只有在我一次处理一个表并使用python实时对其进行后期处理时才会起作用,而且我知道
交叉连接
会生成数据的笛卡尔积,并且在添加其他表和布尔条件时很容易使用太多内存。所以我认为这不是一个选择

还有其他我没有想到的方法吗


谢谢大家!

我想您正在寻找表的
联合体

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是您想要加入的表。

您能告诉我您想要什么输出吗…?1。您的文本不清楚M1、M2和N或您想要的输出。用足够的句子清楚地解释。阅读并付诸行动。确切地告诉我们哪些列是FKs到其他列的。2.您对实现有误解。这两个连接将以相同的方式在任何实际的DBMS中实现。此外,您还需要更多地了解查询的哪些部分意味着什么&如何编写简单的查询,然后再考虑实现的优化。@philipxy:首先,我明确表示,我在这里学习,不需要批评。虽然我可以很容易地找到你所有疑问的答案,但我已经阅读了你的链接。这没有多大帮助。另一方面,你不可能认为内部连接和交叉连接具有相同的效果,交叉连接使我的进程崩溃。我不知道你所说的“批评”是什么意思。我要告诉你一些有用的东西。关于链接,逗号是交叉连接,其优先级低于使用“连接”的连接——我对这个问题有这样的评论。如果你崩溃了,不管你的问题是什么,它不是交叉连接和内部连接。我们不同意你信息的清晰性。它可能会说一些与你正在做的事情一致的话,但它无法解释。如果您在这些表的设计上有一些选择,那么如果您想要这样的查询,那么它们可能设计得很糟糕。它们是“数据透视的”——数据变量已放入列名中。请参阅关系数据库设计简介。对于人们来说,数据透视表试图看起来像是格式化的输出,但它们很难查询。谢谢,它很管用。这是最有效的方法吗?@Chang-欢迎..如果你想从不同的表格中选择我所知道的方法,而且我想大多数情况下没有其他方法…如果有效或对你有帮助,请使用accpet/upvote
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