作者love112302 (小黑炭)
看板Database
標題[SQL ] Nest Query 精進的方法 (空間查詢)
時間Wed Jul 5 01:34:46 2017
資料庫名稱: MSSQL
資料庫版本: 2012
內容/問題描述:
Table A:
Columns: geom, type
======================
Table B, field_A, field_B
Columns: geom
======================
目前有兩個表格, 一個是 A, 一個B
我要從A這邊做完第一次篩選之後, 再到B把跟A有交集到的都挑出來
目前我的作法是這樣
WITH points as
(
SELECT geom
FROM A
WHERE type = 'some-type'
)
SELECT *
FROM B
WHERE points.geom.STContains(B.geom) = 1;
GROUP BY B.field_A B.field_B
ORDER BY B.field_B
這樣的成果會有很多重複資料, 所以不得不用 Group by.
想請問有沒有更好的作法
stored procedure 也可以
我嘗試過把 WHERE 改成 JOIN, 但速度上好像沒什麼差異
有其他關鍵字可以提供嗎 感激
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.253.206.44
※ 文章網址: https://www.ptt.cc/bbs/Database/M.1499189689.A.2F3.html
※ 編輯: love112302 (111.253.206.44), 07/05/2017 01:36:31
※ 編輯: love112302 (111.253.206.44), 07/05/2017 01:37:42
→ smlboby: A加distinct,B去掉group by? 07/05 10:24
Hello, 謝謝您的回覆
如果 B 不加上 group by 會多出很多重複的資料
因為一個 A_row_1 可能包含 B1, B2, B3
但 A_row_2 又可能 再次包含 B1, B2, B3
所以會重複兩次 B1, B2, B3
因為這樣才加上 group by
想請問有辦法避免嗎
※ 編輯: love112302 (111.253.206.44), 07/05/2017 22:23:44
→ flowwinds: 我不懂預存程序 但不知道能不能在裡面做到比如A row1已 07/06 10:11
→ flowwinds: 包含B1/B2/B3了 之後Arow2就跳過B1/B2/B3.. 07/06 10:12
恩 我也是希望有這個方法XD
但我知道為什麼會這麼慢了
MSSQL 在做空間查詢 尤其是 STBuffer 的時候超級慢
改用 STDistance < bufferDistance 就超級快 (攤手
※ 編輯: love112302 (36.235.11.186), 07/06/2017 21:57:26
推 jackiechin: SELECT * FROM B WHERE geom IN 11/16 18:57
→ jackiechin: (SELECT geom FROM A WHERE type = 'some-type') 11/16 18:57
→ jackiechin: 不知道有沒有會錯意 11/16 18:58