以一对多关系连接多个表

Joining multiple tables with one to many relationship

我有 3 个表:

maintable(id, serialno, col3, col4, col5, ..., col10)

table1(t1_id, serialno, t1_type, t1_color)

table2(t2_id, serialno, t2_base, t2_price)

maintable 的主键是id,serialno 是唯一的。 表 1 的主键是 t1_id,表 2 的是 t2_id。 Table1 和 Table2 serialno 是引用 MainTable 的 serialno 的外键。

maintable 与 table1 和 table2 具有一对多关系。

我想做的是将这 3 个表连接到一个数据表中。

我一开始以为这很简单,然后我尝试了:"SELECT * FROM maintable INNER JOIN table1 ON maintable.serialno = table1.serialno INNER JOIN table2 ON maintable.serialno= table2.serialno WHERE maintable.id = 200";

结果的问题是,如果表 1 有 3 行,表 2 有 4 行,那么我的 DataTable 就变成了 12 行 (3x4)。在这种情况下我想做的只是获取 4 行。

table1 和 table2 列之间没有任何关系,它们只需要匹配 maintable 的 serialno。

如果我不被理解,我想 select table1 和 table2 中与 maintable 的 serialno 匹配的行,并将它们添加到 maintable 的右侧,而不会使它们重复。

编辑:抱歉,在某些情况下我写了 accountno 而不是 serialno。

SELECT
    maintable.accountno
FROM
    maintable
    INNER JOIN table1 ON
        maintable.accountno = table1.accountno
    INNER JOIN table2 ON
        maintable.accountno = table2.accountno
WHERE
    maintable.id = 200
GROUP BY
    maintable.accountno
SELECT * FROM
maintable m
INNER JOIN (
SELECT t1.serialno, t1.t1_type, t1.t1_color, null as t2_base, null as t2_price
FROM table1 t1
UNION 
SELECT t2.serialno, null as t1_type, null as t1_color, t2.t2_base, t2.t2_price
FROM table2 t2
) t ON m.serialno = t.serialno
ORDER BY m.serialno

这将满足您的要求:return t1 中的行数 + t2 中的行数,而不是 t1 中的行 x t2 中的行数。 Fiddle。如果你有大量的数据,这可能不会那么热。

既然知道是怎么做到的,那就别做了。

真正的问题是 为什么这是一项要求?您在这里真正想要完成什么?鉴于它们之间的关系,这不是一种合并来自两个子表的数据的有意义的方式。 T1 和 t2 是不同的表,并且没有相互键控是有原因的:它们不打算像这样组合它们的数据。

我能想象从这种查询中提取的唯一新数据是给定序列号的 t1 和 t2 中的总行数。但是有 很多 比选择这样的行更好的方法来获取此信息。如果您同时需要 t1 和 t2 数据并且重复项让您失望,那么您应该制作两个单独的 SELECT 语句而不是尝试组合所有内容的可能性很大。