两次加入同一个表:全面探索
在本次讨论中,我们解决了开发人员面临的一个常见困境:高效加入同一个表表多次。挑战在于获取包含两个连接条件的数据的结果集。
考虑以下表结构:
*Table1* ID PhoneNumber1 PhoneNumber2 *Table2* PhoneNumber SomeOtherField
目标是检索 PhoneNumber1、PhoneNumber1、PhoneNumber2 对应的 SomeOtherField ,以及PhoneNumber2对应的SomeOtherField。
方法一:多表连接
此方法涉及在表上连接两次:
SELECT t1.PhoneNumber1, t1.PhoneNumber2, t2.SomeOtherFieldForPhone1, t3.someOtherFieldForPhone2 FROM Table1 t1 INNER JOIN Table2 t2 ON t2.PhoneNumber = t1.PhoneNumber1 INNER JOIN Table2 t3 ON t3.PhoneNumber = t1.PhoneNumber2
此方法可靠,但显得有点冗长。
方法 2:OR -Based Joining
为了简化查询,开发人员建议使用 OR ON 条件中的子句:
SELECT ... FROM Table1 INNER JOIN Table2 ON Table1.PhoneNumber1 = Table2.PhoneNumber OR Table1.PhoneNumber2 = Table2.PhoneNumber
但是,这种方法在 SQL 中无效,会导致错误。
最佳实践
在这种情况下,建议使用方法 1,因为它清晰且可靠。值得注意的是,强烈建议重构表以避免使用自然键(例如电话号码)。自然键很容易发生变化,从而导致维护过程具有挑战性。
多次连接同一个表时,别名对于可读性和易于理解至关重要。别名有助于区分表的多个实例。
这是方法 1 的优化版本:
SELECT t.PhoneNumber1, t.PhoneNumber2, t1.SomeOtherFieldForPhone1, t2.someOtherFieldForPhone2 FROM Table1 t JOIN Table2 t1 ON t1.PhoneNumber = t.PhoneNumber1 JOIN Table2 t2 ON t2.PhoneNumber = t.PhoneNumber2
以上是如何在SQL中高效地两次连接同一个表以从多个连接条件中检索数据?的详细内容。更多信息请关注PHP中文网其他相关文章!