【发布时间】:2017-12-19 09:09:18
【问题描述】:
我对@987654325@ 和Sqlite 很陌生,我可能做的不对,但是出于学术原因,我正在尝试使用我自己创建的脏数据库来学习基础知识。如果词汇不正确,请见谅,我还在学习过程中。
我创建了一组表,每个表都有不同类型的实体,但它们都具有相似性:它们共享多个具有不同值的相同 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 Keys 到Unique Key 以后(表N):
+------------+---------+--------+-------+
Primary Key Unique ID Data1 Data2
+------------+---------+--------+-------+
1 100002 ... ...
2 103001 ... ...
3 103021 ... ...
4 103022 ... ...
我需要做的就是提取所有共享给定唯一项目的实体(我的Foreign Key)。例如,给定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
INNER JOIN 仅在我一次处理一张表并使用 python 实时对其进行后处理时才有效,并且我了解CROSS JOIN 会生成我的数据的笛卡尔积,并且在以下情况下很容易使用过多的内存我将添加其他表和布尔条件。所以我认为这不是一个选择。
还有其他我没有想到的方法吗?
谢谢大家!
【问题讨论】:
-
你能告诉我你想要什么输出吗...?
-
1.您的文字不清楚 M1、M2 和 N 或您想要的输出。使用足够的句子来清楚地解释。阅读minimal reproducible example 并采取行动。准确告诉我们哪些列是其他列的 FK。 2. 你对实现有误解。这两个连接将在任何实际的 DBMS 中以相同的方式实现。 stackoverflow.com/q/44917/3404097 此外,在您担心实现优化之前,您需要更多地了解查询的含义以及如何编写简单的查询。
-
@philipxy :首先,我明确表示我是来学习的,无需批评。虽然我可以很容易地在我的问题中找到你所有疑问的答案,但我已经阅读了你的链接。它没有多大帮助。另一方面,您不可能建议 INNER 和 CROSS Join 具有相同的效果,CROSS join 使我的进程崩溃。
-
我不知道你所说的“批评”是什么意思。我告诉你一些有用的东西。重新链接,逗号是交叉连接,其优先级低于使用“连接”的连接——我对此问题发表了评论。重新崩溃,无论您的问题是什么,都不是交叉连接与内部连接。 stackoverflow.com/a/25957600/3404097 sqlite.org/optoverview.html 我们不同意您信息的清晰度。它可能会说与你正在做的事情一致的事情,但它并没有解释它。
-
嗨。如果您对这些表的设计有一些选择,如果您想要这样的查询,那么它们可能设计得很糟糕。它们是“透视的”——数据变化已被放入列名中。请参阅关系数据库设计简介。透视表试图看起来像人们的格式化输出,但它们很难查询。
标签: sql sqlite join foreign-keys