有没有一种简单/有效的方法可以在SQL中多次查找ID中的值,而无需多次联接?
我有两张桌子。一个表有一个ID列,然后是其他数据。另一个表具有多个与第一个表相对应的“ID”字段。我知道我可以做多个连接,但是每个表有400000多条记录,所以我想也许有更有效的方法 以下是我的意思的一个例子: 这是我的查找表:有没有一种简单/有效的方法可以在SQL中多次查找ID中的值,而无需多次联接?,sql,join,Sql,Join,我有两张桌子。一个表有一个ID列,然后是其他数据。另一个表具有多个与第一个表相对应的“ID”字段。我知道我可以做多个连接,但是每个表有400000多条记录,所以我想也许有更有效的方法 以下是我的意思的一个例子: 这是我的查找表: +----+------+---------+ | ID | Name | Title | +----+------+---------+ | 1 | a | alpha | | 2 | b | bravo | | 3 | c | c
+----+------+---------+
| ID | Name | Title |
+----+------+---------+
| 1 | a | alpha |
| 2 | b | bravo |
| 3 | c | charlie |
| 4 | d | delta |
+----+------+---------+
这是我的输入表。该示例只有2个查找列,但生产表有10个
+----+------------+------------+
| ID | Lookup ID1 | Lookup ID2 |
+----+------------+------------+
| 1 | 1 | 3 |
| 2 | 2 | 3 |
| 3 | 2 | 4 |
| 4 | 2 | 4 |
| 5 | 2 | 2 |
| 6 | 2 | 2 |
| 7 | 3 | 4 |
| 8 | 1 | 3 |
+----+------------+------------+
这是预期的输出
+----+---------------+----------------+---------------+----------------+
| ID | Lookup Name 1 | Lookup Title 1 | Lookup Name 2 | Lookup Title 2 |
+----+---------------+----------------+---------------+----------------+
| 1 | a | alpha | c | charlie |
| 2 | b | bravo | c | charlie |
| 3 | b | bravo | d | delta |
| 4 | b | bravo | d | delta |
| 5 | b | bravo | b | bravo |
| 6 | b | bravo | b | bravo |
| 7 | c | charlie | d | delta |
| 8 | a | alpha | c | charlie |
+----+---------------+----------------+---------------+----------------+
我知道我可以使用多个联接(在我的生产环境中为10个联接)来实现这一点,但必须有一种更有效的方法?使用联接执行此操作,关系数据库就是这样做的:
select i.id, l1.*, l2.*
from input i left join
lookup l1
on i.lookupid1 = l1.id left join
lookup l2
on i.lookupid2 = l2.id;
(如果缺少一个ID,则左连接确保没有丢失任何行。)
为了提高性能,您需要在
lookup(id)
或lookup(id,name)
上建立索引。因为id
应该声明为主键,所以不需要另一个索引。使用联接执行此操作,关系数据库就是这样做的:
select i.id, l1.*, l2.*
from input i left join
lookup l1
on i.lookupid1 = l1.id left join
lookup l2
on i.lookupid2 = l2.id;
(如果缺少一个ID,则左连接确保没有丢失任何行。)
为了提高性能,您需要在lookup(id)
或lookup(id,name)
上建立索引。因为id
应该声明为主键,所以不需要另一个索引。您可以通过一个连接来实现,但我不建议这样做。它将涉及一个复杂的连接条件,比如(b.id1,b.id2,…)中的a.id和条件聚合;并且可能比多连接等效程序慢得多
表结构很可能无法满足您的需求(尽管在不了解更多关于所表示内容的细节的情况下很难确定);如果无法更改,则多连接是最佳解决方案
另外,我应该注意到,您关于多个联接效率低下的假设是不正确的。RDBMS系统中的“效率”通常更受索引和使用这些索引的能力的影响。(b.id1,b.id2,…)中的a.id很差的原因之一是,当条件相当于一个或时,MySQL几乎忽略了索引。您可以通过一个连接来实现,但我不推荐这样做。它将涉及一个复杂的连接条件,比如(b.id1,b.id2,…)
中的a.id和条件聚合;并且可能比多连接等效程序慢得多
表结构很可能无法满足您的需求(尽管在不了解更多关于所表示内容的细节的情况下很难确定);如果无法更改,则多连接是最佳解决方案
另外,我应该注意到,您关于多个联接效率低下的假设是不正确的。RDBMS系统中的“效率”通常更受索引和使用这些索引的能力的影响。(b.id1,b.id2,…)
中的a.id很差的原因之一是MySQL几乎忽略了索引,当条件相当于一个或MySQL或SQL Server时,它们具有不同的功能,可能有助于回答问题。这是什么DBMS?不同的答案取决于…MySQL或SQL Server他们有不同的功能,这可能有助于回答。这是什么DBMS?不同的答案取决于…谢谢。我想知道是否有其他方法可以不用连接,但我想没有。谢谢。我想知道是否有另一种不用连接的方法,但我想没有。