我有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。
答案 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语句而不是尝试组合所有内容的可能性很大。