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

C# 使用一对多关系连接多个表,c#,sql,postgresql,join,C#,Sql,Postgresql,Join,我有三张桌子: 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\u id,表2的主键是t2\u id。 Table1和Table2 serialno是引用MainTable的seria

我有三张桌子:

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\u id,表2的主键是t2\u id。 Table1和Table2 serialno是引用MainTable的serialno的外键

maintable与表1和表2都有一对多关系

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

我最初认为这很简单,于是我尝试了:“在maintable.serialno=table1.serialno内部联接table2.maintable.serialno=table2.serialno WHERE maintable.id=200上从maintable内部联接table1中选择*”

结果的问题是,如果表1有3行,表2有4行,那么我的DataTable将变成12行(3x4)。在这个例子中,我要做的是只获取4行

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

如果我没有被理解,我想选择表1和表2中与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
这将满足您的要求:返回t1中的行数+t2中的行数,而不是t1中的行数x t2中的行数。如果您有大量数据,这可能不会执行得很热

既然你知道怎么做了,就别做了

真正的问题是为什么这是一个要求?你到底想在这里完成什么?考虑到两个子表之间的关系,这不是一种有意义的方式来组合两个子表中的数据。T1和t2是不同的表,没有相互设置键,原因是:它们不打算像这样组合它们的数据


我能想象的从这种查询中提取的唯一新数据是给定序列号的t1和t2中的行总数。但是有比选择这样的行更好的方法来获取这些信息。如果您同时需要t1和t2数据,并且重复的数据会让您感到厌烦,那么您很有可能需要创建两个单独的SELECT语句,而不是尝试组合所有数据。

原始查询具有SELECT*,即所有3个表中的所有列。如果您希望获取每一列,那么如何期望它只返回4行(除非您想使用聚合)?等一下,maintable.id=200的maintable中有3行。表2有4行与这3行maintable匹配。您想如何从得到的3 x 4=12行中提取数据?maintable.id=200的maintable中只有1行。表1有3行与serialno匹配,表2有4行。我最终想做的是显示表1中与serialno匹配的列与表2中的列相同。表1和表2之间没有我需要的任何关系。我可以在单独的SQL查询中执行此操作,但我尝试在一个大数据表中执行此操作,因为我将有3到4个类似于表1和表2的表。我不知道这是否可行。您想如何执行此操作当表1有3行时,表2有4行,从两个表中获取数据?至少有7行7行是可以的。现在我得到12行,这意味着行是相乘的,当我添加更多表时,数据表将变得非常大。如果只是添加行,没有问题。如果两个表列相同,那么可以使用union完成。现在您需要两个单独的选择这正是我想要的。我最终想要做的是,正如我所说的,有6-7个表,它们都引用主表中的一个键(serialno)并在页面中显示它们的列。我正在尝试找出最好的方法,我认为最好的方法不是对每个表执行sql select查询,而是将它们连接到一个大数据表中,然后从中获取我想要的记录。如果这不是最佳解决方案,请以正确的方式指导我。谢谢!@user4483037正确的方法是对每个SQL表使用单独的select语句,在应用程序中创建对象列表,并使用来自不同SQL查询的数据填充它们的属性。应用程序可以比数据库可以将所有表放在一个SQL查询中更有效地完成这项工作“可能无法在大数据集上表现得如此出色”,这实际上意味着“这将失去与生产环境中落后的蜗牛的竞争”。
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