Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种简单/有效的方法可以在SQL中多次查找ID中的值,而无需多次联接?_Sql_Join - Fatal编程技术网

有没有一种简单/有效的方法可以在SQL中多次查找ID中的值,而无需多次联接?

有没有一种简单/有效的方法可以在SQL中多次查找ID中的值,而无需多次联接?,sql,join,Sql,Join,我有两张桌子。一个表有一个ID列,然后是其他数据。另一个表具有多个与第一个表相对应的“ID”字段。我知道我可以做多个连接,但是每个表有400000多条记录,所以我想也许有更有效的方法 以下是我的意思的一个例子: 这是我的查找表: +----+------+---------+ | ID | Name | Title | +----+------+---------+ | 1 | a | alpha | | 2 | b | bravo | | 3 | c | c

我有两张桌子。一个表有一个ID列,然后是其他数据。另一个表具有多个与第一个表相对应的“ID”字段。我知道我可以做多个连接,但是每个表有400000多条记录,所以我想也许有更有效的方法

以下是我的意思的一个例子:

这是我的查找表:

+----+------+---------+
| 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?不同的答案取决于…谢谢。我想知道是否有其他方法可以不用连接,但我想没有。谢谢。我想知道是否有另一种不用连接的方法,但我想没有。