Postgresql,用两个值连接同一个表?

问题描述 投票:0回答:1

我需要使用多个 JOINS 和多个 WHERE 子句根据外键 id 从各个表中提取数据。

目前我有这个(当然不起作用):

SELECT table_1.*
        FROM table_1
            JOIN table_2
            ON table_1.from = table_2.id
            WHERE table_2.name = 'from-city'
            
            JOIN table_2
            ON table_1.to = table_2.id
            WHERE table_2.name = 'to-city'
            
        ORDER BY table_1.id;

我需要以一种将来可以添加大量其他 WHERE 子句的方式实现这一点(考虑基于 queryStrings [URLSearchParams] 的动态查询)。

从长远来看,我该如何“思考”这个问题才不会搬起石头砸自己的脚?

我发现要使用多个连接,你必须执行以下操作:

SELECT table_1.*
        FROM table_1
            JOIN table_2
            ON table_1.from = table_2.id AND table_1.to = table_2.id
-- But this screws up my where clause 'logic' …
            WHERE table_2.name = 'from-city' ?  
            WHERE table_2.name = 'to-city'   ?
            
        ORDER BY table.id;

但我想这就是你们谈论不同价值观的地方,对吧?

我更愿意写一些类似的东西:

SELECT table_1.*
        FROM table_1
            JOIN table_2
            ON table_1.from = table_2.id
            WHERE table_2.name = 'from-city'
            
            AND table_1.to = table_2.id
            WHERE table_2.name = 'to-city'
            
        ORDER BY table_1.id;

为了让我以这种更易于管理、动态和可读的方式编写查询,正确的“思维模式”是什么?

我尝试了什么? 我只是在谷歌上搜索了一些废话,观看了有关复杂 SQL 查询的视频,并进行了疯狂的猜测——在这方面并没有真正帮助自己。

postgresql join dynamic where-clause
1个回答
0
投票

连接同一个表两次的正确语法是为其指定不同的别名,从而能够将这两行视为来自不同的表:

SELECT *
FROM table_1 t1
JOIN table_2 t2a ON t2a.id = t1.from and t2a.name = 'from-city'
JOIN table_2 t2b ON t2b.id = t1.to and t2b.name = 'to-city'
ORDER BY t1.id;

我希望这能回答您的问题。

但是,如果你只想从第一个表中选择数据,那么你只需要第二个表作为过滤条件,我根本不会加入,而是将条件放在它所属的where子句中:

SELECT *
FROM table_1 t1
WHERE t1.from = (SELECT id FROM table_2 WHERE name = 'from-city')
  AND t1.to   = (SELECT id FROM table_2 WHERE name = 'to-city')
ORDER BY t1.id;
© www.soinside.com 2019 - 2024. All rights reserved.