簡體   English   中英

以一對多關系連接多個表

[英]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是UNIQUE。 Table1的主鍵是t1_id,而table2的主鍵是t2_id。 Table1和Table2序列號是引用MainTable序列號的外鍵。

maintable與table1和table2具有一對多關系。

我想要做的是將這3個表連接到一個DataTable中。

我首先想到這會很簡單,然后我嘗試了:“ SELECT * FROM maintable INNER JOIN table1 ON maintable.serialno = table1.serialno INNER JOIN table2 ON maintable.serialno = table2.serialno WHERE maintable.id = 200”;

結果的問題是,如果table1具有3行,而table2具有4行,則我的DataTable變為12行(3x4)。 在這種情況下,我想做的只是得到4行。

table1和table2列之間沒有任何關系,它們只需要匹配maintable的serialno。

如果我不了解,我想選擇與maintable的serialno相匹配的table1和table2的行,並將它們添加到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

這將滿足您的要求:返回t1中的行數+ t2中的行數,而不是t1中的行數x t2中的行數。 小提琴 如果您有大量數據,此操作可能不會很熱。

現在您知道它是如何完成的,就不要做。

真正的問題是為什么這是一個要求? 您真正想在這里完成什么? 給定它們之間的關系,這不是組合兩個子表中數據的有意義方式。 T1和t2是不同的表,由於某種原因彼此沒有鍵:它們並不是要像這樣合並它們的數據。

我可以想象從這種查詢中提取的唯一新數據是給定序列號的t1和t2中的行總數。 但也有很多更好的方法來得到這個信息不是選擇這樣的行。 如果您同時需要t1和t2數據,並且重復數據會讓您失望,那么很有可能應該使用兩個單獨的SELECT語句,而不要嘗試將所有內容組合在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM