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子句不是一种浪费;事实上,这是绝对必要的。