使用三個示例表:
A: pk_a, name
B: pk_b, name, fk_a
C: pk_c, name, fk_b
如何僅使用值從底部到頂部/父級或連接/獲取相應的表 A 和 B 行pk_c?
使用 asyncpg (python) 無法使用WHERE pk_c IN (value1..valueN)- 到目前為止我只有這個:
conn.fetch("SELECT * FROM C WHERE pk_c = any($1::int[])", data_list)
并且沒有足夠的能力知道從這里去哪里。使用左連接我可以看到如何從上到下(至少使用兩個表,不太確定帶有三個表或幾個左連接的 SQL),但不是從下到上,同時在WHERE. 有人可以幫我解決這個問題嗎?
感謝您的時間和幫助。
uj5u.com熱心網友回復:
假設 僅使用 pk_c 值意味著“我只有 C ID 值”而不是“我不允許在 SQL 中的任何位置提及除 C 之外的任何主鍵列”,您可以只進行連接(任何順序)
SELECT *
FROM
a
INNER JOIN b ON a.pk_a = b.fk_a
INNER JOIN c ON b.pk_b = c.fk_b
WHERE
c.pk_c IN (...)
如果您正在努力將 IN 與查詢庫一起使用,這更像是庫的限制而不是 SQL 中的任何錯誤:IN 需要一個值串列,并且它們不能被引數化為單個串列。你不能說:
WHERE x IN (@someParameter)
然后將陣列打包到客戶端代碼中的 @someparameter 中,除非您使用的庫特別支持查看陣列并將其拆分/修改 SQL 如下(對于 3 長陣列):
WHERE x IN (@someParameter1,@someParameter2,@someParameter3)
然后提供價值array[0]into @someparameter1,array[1]into @someparameter2。
如果選擇的庫不這樣做(或者您沒有使用庫),您可以
- 自己做 - 將一個新的引數占位符重復連接到您的 IN 串列中,并從陣列中為其提供一個值
- 以另一種方式將資料傳遞給資料庫,例如將其轉換為 JSON 陣列字串,將單個字串引數發送到資料庫(其中包含 json)并讓資料庫將 JSON 解壓縮為值串列
- 采取危險的方法“它是一個整數陣列;我會直接將它們連接起來,因為在這種情況下它不是 SQL 注入黑客風險”——盡管不要用字串陣列來做。
uj5u.com熱心網友回復:
SELECT
*
FROM "C"
LEFT JOIN "B" ON "fk_b" = "pk_b"
LEFT JOIN "A" ON "fk_a" = "pk_a"
WHERE
"pk_c" IN (2, 3, 5)
因為LEFT JOIN如果 C 中有一行在“B”中沒有匹配的行,您也會在結果中得到一行。從“B”到“A”的關系也是如此。但是,既然您提到了可能永遠不會發生的父/子關系,那么 anINNER JOIN也可以使用。
uj5u.com熱心網友回復:
您將外鍵連接到主鍵。
由于條件在 C 上,您可以從 C 開始。
但如果它只是 INNER JOIN,那么連接的順序并不重要。
無論如何,Postgresql 都會嘗試使用最快的方法來獲取資料。
SELECT *
FROM C AS c
JOIN B AS b ON b.pk_b = c.fk_b
JOIN A AS a ON a.pk_a = b.fk_a
WHERE c.pk_c = ANY($1::int[])
如果你想要所有的 C,不管是 fk_b 還是 fk_a。然后你可以簡單地使用 LEFT JOIN。
SELECT *
FROM C AS c
LEFT JOIN B AS b ON b.pk_b = c.fk_b
LEFT JOIN A AS a ON a.pk_a = b.fk_a
WHERE c.pk_c = ANY($1::int[])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410445.html
標籤:
上一篇:為什么Postgres從9.2.24升級到10.17性能大幅下降?
下一篇:根據id從表中獲取用戶
