在2个表中的2列上使用LIKE并在第3个表上进行连接

时间:2018-02-17 20:05:29

标签: postgresql join

我希望在表格上使用LIKEjoin时提供一些帮助。我目前是一名学生,并参加了迄今为止重点关注代数的课程。基于此,我的直觉是做多个笛卡尔积,然后设定条件并投射我想要的东西。但是,我并不太了解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

请帮助解释它是如何实现的,而不仅仅是解决方案。提前谢谢。

1 个答案:

答案 0 :(得分:0)

看起来它会像你描述的那样做,所以它应该是一个正确的解决方案,但有些事情可以改进:

  1. 您不使用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';
    
  2. 不要在对象名称中使用大写字母,这样就不必引用标识符。

  3. "Accounts""Documents"之间的联接条件会使查询效率低下。

    这种条件的唯一连接策略不仅是嵌套循环连接,而且它的编写方式,它不能使用B树索引并导致顺序扫描( trigram索引可能会有所帮助。)