使用一对多关系连接多个表

时间:2015-01-23 08:03:58

标签: c# sql postgresql join

我有3张桌子:

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

table1(t1_id, serialno, t1_type, t1_color)

table2(t2_id, serialno, t2_base, t2_price)

维护主键是id,serialno是UNIQUE。 表1的主键是t1_id,表2是t2_id。 Table1和Table2 serialno是引用MainTable的serialno的外键。

maintainble与table1和table2都有一对多的关系。

我想要做的是在DataTable中加入这3个表。

我首先想到的很简单,我试过:" SELECT * FROM maintable INNER JOIN table1 ON maintable.serialno = table1.serialno INNER JOIN table2 ON maintable.serialno = table2.serialno WHERE maintable.id = 200&#34 ;;

结果的问题是如果table1有3行而table2有4行,那么我的DataTable变成12行(3x4)。我想在这个例子中做的只是获得4行。

table1和table2列彼此之间没有任何关系,他们只需匹配维护的serialno。

如果我没有被理解,我想选择与维护的serialno相匹配的table1和table2的行,并将它们添加到维护的右侧而不会重复。

编辑:对不起,在某些情况下我写过accountno而不是serialno。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

这将执行您要求的操作:返回t1中的行数+ t2中的行数,而不是t1中的行数和t2中的行数。 Fiddle。如果你有大量的数据,这可能不会那么热。

现在你知道它是如何完成的,不要这样做。

真正的问题是为什么这是一个要求?你真的想在这里完成什么?考虑到它们之间的关系,这不是一种有意义的方法来组合来自两个子表的数据。 T1和t2是不同的表格,并且没有彼此键入的原因是:它们并不意味着像这样组合它们的数据。

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