Skip to main content

SQLite交叉连接实例

SQLite交叉连接子句简介

如果在没有ON或USING子句的情况下使用左连接、内连接或交叉连接,SQLite将生成相关表的笛卡尔积。笛卡尔乘积中的行数是每个相关表中的行数的乘积。

假设我们有两个表A和B。下面的语句执行交叉连接,并生成A和B表中行的笛卡尔积。

SELECT *
FROM A JOIN B;
SELECT *
FROM A
INNER JOIN B;
SELECT *
FROM A
CROSS JOIN B;
SELECT * 
FROM A, B;

假设A表有N行,B表有M行,这两个表的交叉连接将产生一个包含NxM行的结果集。

想象一下,如果第三个表C有K行,这三个表的交叉连接子句的结果将包含NxMxK行,这可能非常大。因此,在使用交叉连接子句时应该非常小心。

与交叉连接子句相比,使用内部连接子句和左连接子句的频率更高。然而,您会发现交叉连接子句在某些情况下非常有用。

例如,当你想要一个矩阵,它有两个维度,充满了数据,就像成员数据库中的成员和日期数据一样。您想查看会员的服务员,了解所有相关日期。在这种情况下,可以将交叉连接子句用作以下语句:

SELECT name,
date
FROM members
CROSS JOIN dates;

SQLite交叉连接子句示例

下面的语句创建存储一副牌的等级和套装的等级和套装表,并将完整数据插入这两个表中。

CREATE TABLE ranks (
rank TEXT NOT NULL
);

CREATE TABLE suits (
suit TEXT NOT NULL
);

INSERT INTO ranks(rank)
VALUES('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('10'),('J'),('Q'),('K'),('A');

INSERT INTO suits(suit)
VALUES('Clubs'),('Diamonds'),('Hearts'),('Spades');

下面的语句使用CROSS JOIN子句返回一组完整的卡片数据:

SELECT rank,
suit
FROM ranks
CROSS JOIN
suits
ORDER BY suit;

在本教程中,您学习了如何使用SQLite交叉联接子句生成联接中涉及的多个表的笛卡尔乘积。