Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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
Mysql 不带两个查询的联接表本身_Mysql_Sql_Join_Cross Join - Fatal编程技术网

Mysql 不带两个查询的联接表本身

Mysql 不带两个查询的联接表本身,mysql,sql,join,cross-join,Mysql,Sql,Join,Cross Join,我见过有人建议通过这样做交叉连接一张桌子: SELECT * FROM tbl AS A, tbl AS B WHERE A.col1 = 1 AND B.col1 = 1 但是在这里,引擎需要迭代tbl中的所有行两次,以便将两个查询与A和B的结果相匹配,尽管查询(因此结果)是相同的 假设A和B上的WHERE始终是相同的,这是一种浪费。有没有办法查询一次某个内容,然后将该查询的结果本身交叉连接起来?我希望避免使用临时表,因为临时表需要磁盘写入,而不是在RAM中执行整个操作 我正在使用MySQL

我见过有人建议通过这样做交叉连接一张桌子:

SELECT *
FROM tbl AS A, tbl AS B
WHERE A.col1 = 1 AND B.col1 = 1
但是在这里,引擎需要迭代tbl中的所有行两次,以便将两个查询与A和B的结果相匹配,尽管查询(因此结果)是相同的

假设A和B上的WHERE始终是相同的,这是一种浪费。有没有办法查询一次某个内容,然后将该查询的结果本身交叉连接起来?我希望避免使用临时表,因为临时表需要磁盘写入,而不是在RAM中执行整个操作

我正在使用MySQL,尽管任何SQL答案都会有很大帮助

示例:

假设tbl如下所示:

COL1    COL2
1       A
1       B
1       C
2       D
2       E
当我运行col1=1的where子句时,它返回上表中的前三行。我想要的是下表,但只执行一次where语句,因为两个表A和B是相同的:

A.COL1    A.COL2    B.COL1    B.COL2
1         A         1         A
1         A         1         B
1         A         1         C
1         B         1         A
1         B         1         B
1         B         1         C
1         C         1         A
1         C         1         B
1         C         1         C

我真的建议避免连接语法。。。它可能很难阅读

你对你要做的事情的解释有点含糊不清。所编写的查询不提供联接操作的值。一般来说,当您要将表连接到自身时,它位于不同的列上:

select *
from tbl as a
inner join
table as b
on a.col1 = b.col2
where 
a.col1 = 1;
这允许您对表进行查询,还可以收集以分层方式组织在同一表中的相关信息。例如:

create table tbl (
person_id int,
parent_id int
);
在这种情况下,父母也是一个人。如果您想获得与ID为1的人相关的父母列表,您可以写:

select
person.person_id as OriginalPerson,
parent.person_id as Parent
from
tbl as person
inner join
tbl as parent
on parent.person_id = person.person_id
where
person.person_id = 1;
更新阅读进一步解释后,您需要笛卡尔积:

select a.*, b.*
from tbl as a
inner join tbl as b
on 1=1
where a.col1 = 1
and b.col1 = 1

你基本上是在要求一个有意的笛卡尔连接

select
      a.col1,
      a.col2,
      b.col1,
      b.col2
   from
      tbl a
         join tbl b
            on a.col1 = b.col1
   where
      a.col1 = 1
   order by
      a.col2,
      b.col2

要准确地命中输出顺序,需要按“a”列2的顺序,然后按“b”的顺序第2列

您能否举例说明如何从查询中构造结果集?您可以使用表变量而不是临时表:请参见下面的我的笛卡尔乘积查询。这只是返回tbl中所有内容与其他内容的联接。没有条件。所以您只希望col1=1时使用它?我以为你只是把它当作一个错误的连接条件。在这种情况下,双WHERE子句不是一种浪费;事实上,这是绝对必要的。