【发布时间】:2019-12-02 04:07:42
【问题描述】:
我有两个表,table1 和 table2。 table1 有“id”列。 table2 有 'id' 和 'quantity' 列。我想比较两个表中“id”列下的相同值,并在 table2 中显示“数量”列下的值。 简单的逻辑是“从 table1 中选择 id=1 与从 table2 中选择 id=1 进行比较,然后从 table2 中显示数量值”。有没有办法查询这个语句?
【问题讨论】:
我有两个表,table1 和 table2。 table1 有“id”列。 table2 有 'id' 和 'quantity' 列。我想比较两个表中“id”列下的相同值,并在 table2 中显示“数量”列下的值。 简单的逻辑是“从 table1 中选择 id=1 与从 table2 中选择 id=1 进行比较,然后从 table2 中显示数量值”。有没有办法查询这个语句?
【问题讨论】:
加入表格:
SELECT *
FROM
table1 t1
INNER JOIN table2 t2
ON t1.id = t2.id
使用 INNER JOIN 将导致结果仅显示两个表中存在相同 ID 的行。如果您想显示表 1 中的所有行和表 2 中的匹配行,加上对于特定表 1 id 没有表 2 id 的任何行的空白,则使用 LEFT JOIN 而不是 INNER JOIN。
如果您只想要输出中的某些列,您可以列出它们:
SELECT t1.id, t2.quantity
...
等
在大多数其他数据库系统中都存在 LEFT join 的推论;正确的加入。如果您想要表 2 中的所有行加上表 1 中的匹配行,以及没有相关表 1 行的空白,请使用 RIGHT JOIN。 SQLite 不支持 RIGHT 连接,因此您必须重写查询(交换表名),以便 t2 在左侧。重要的是表名,而不是 ON 部分的出现顺序:
--all rows from t1 plus any matching rows from t2
SELECT *
FROM
table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.id
--all rows from t2 plus any matching rows from t1
SELECT *
FROM
table2 t2
LEFT JOIN table1 t1
ON t1.id = t2.id
最终您会遇到一个 FULL [OUTER] JOIN,即“来自 t1 的所有行和来自 t2 的任何匹配,以及来自 t2 的任何其他行及其可能来自 t1 的匹配”。 SQLite 也不支持这个,但它可以被模拟。通常它使用 LEFT JOIN UNION RIGHT JOIN 进行模拟,但由于 SQLite 不支持 RIGHT,因此您必须使用两个 LEFT 连接来模拟它,其中一个是交换表:
--all rows from t1 plus any matching rows from t2
SELECT *
FROM
table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.id
UNION
SELECT *
FROM
table2 t2
LEFT JOIN table1 t1
ON t1.id = t2.id
科尔。所有这些都是为了能够在例如SQLServer:
SELECT *
FROM
table1 t1
FULL OUTER JOIN table2 t2
ON t1.id = t2.id
【讨论】: