我希望在表格上使用LIKE
和join
时提供一些帮助。我目前是一名学生,并参加了迄今为止重点关注代数的课程。基于此,我的直觉是做多个笛卡尔积,然后设定条件并投射我想要的东西。但是,我并不太了解SQL。我试图对下面的查询进行的操作主要是从一堆特定文档(发票)中获取帐户名称与抽屉名称的近似匹配。如果找到该帐户的发票,请使用其ID从AccountsMonitoredBy返回该帐户的内部ID以及该文档的详细信息。
以下是我认为的逻辑:
如果Documents.drawer中的Accounts.accname: 然后如果Accounts.accountid = AccountsMonitoredBy.accid return AccountsMonitoredBy.internal_id,Documents.docnum,Documents.doc_date,Accounts.accname
SELECT "AccountsMonitoredBy".internal_id, "Accounts".accname, "Documents".docnum, "Documents".doc_date
FROM "Accounts", "Documents", "AccountsMonitoredBy"
WHERE "Accounts".accname LIKE '%' || "Documents".drawer || '%' and "Documents".doc_type = 'INVOICE'
and "AccountsMonitoredBy".accid = "Accounts".accountid
请帮助解释它是如何实现的,而不仅仅是解决方案。提前谢谢。
答案 0 :(得分:0)
看起来它会像你描述的那样做,所以它应该是一个正确的解决方案,但有些事情可以改进:
您不使用SQL连接语法。为了避免忘记连接条件(投影)的常见错误,请写:
SELECT "AccountsMonitoredBy".internal_id,
"Accounts".accname,
"Documents".docnum,
"Documents".doc_date
FROM "Accounts"
JOIN "Documents"
ON "Accounts".accname LIKE '%' || "Documents".drawer || '%'
JOIN "AccountsMonitoredBy"
ON "AccountsMonitoredBy".accid = "Accounts".accountid
WHERE "Documents".doc_type = 'INVOICE';
不要在对象名称中使用大写字母,这样就不必引用标识符。
"Accounts"
和"Documents"
之间的联接条件会使查询效率低下。
这种条件的唯一连接策略不仅是嵌套循环连接,而且它的编写方式,它不能使用B树索引并导致顺序扫描( trigram索引可能会有所帮助。)