我需要在此表上使用“自我联接”。
+------------+------+--------+
| Country | Rank | Year |
+------------+------+--------+
|France | 55 | 2000 |
+------------+------+--------+
|Canada | 30 | 2000 |
+------------+------+--------+
|Liberia | 59 | 2001 |
+------------+------+--------+
|Turkey | 78 | 2000 |
+------------+------+--------+
|Japan | 65 | 2003 |
+------------+------+--------+
|Romania | 107 | 2001 |
+------------+------+--------+
我需要使用自我加入来获得与土耳其同年的国家。仅显示国家和年份。
这就是我想要做的。
SELECT DISTINCT a.Country, a.Year
FROM table1 AS a, table1 AS b
WHERE a.Year=b.Year and a.Country='Turkey';
^谷歌自我加入,并做到了。
我只得到土耳其。我究竟做错了什么?
你好亲密!
因为您说的是显示A的国家和年份,并限制了A. Country
土耳其,所以您将只看到土耳其。您需要将selects更改为B.country
and
B.year
或将where子句更改为B.country
。
这是使用交叉联接的,表中的记录越多,交叉联接的速度就会越慢。
SELECT DISTINCT b.Country, b.Year
FROM table1 AS a,
table1 AS b
WHERE a.Year=b.Year
and a.Country='Turkey';
可以写为…,并且可能具有相同的执行计划。
SELECT DISTINCT b.Country, b.Year
FROM table1 AS a
CROSS JOIN table1 AS b
WHERE a.Year=b.Year
and a.Country='Turkey';
或这使用了INNER JOIN,它限制了引擎必须完成的工作,并且不会遭受交叉联接可能导致的性能下降。
SELECT DISTINCT a.Country, a.Year
FROM table1 AS a
INNER JOIN table1 AS b
on a.Year=b.Year
and b.Country='Turkey';
为什么:
考虑一下AB发生联接时SQL引擎将做什么
+------------+------+--------+------------+------+--------+
| A.Country | Rank | Year | B.Country | Rank | Year |
+------------+------+--------+------------+------+--------+
|France | 55 | 2000 |France | 55 | 2000 |
+------------+------+--------+------------+------+--------+
|Canada | 30 | 2000 |France | 55 | 2000 |
+------------+------+--------+------------+------+--------+
|Turkey | 78 | 2000 |France | 55 | 2000 |
+------------+------+--------+------------+------+--------+
|France | 55 | 2000 |Canada | 30 | 2000 |
+------------+------+--------+------------+------+--------+
|Canada | 30 | 2000 |Canada | 30 | 2000 |
+------------+------+--------+------------+------+--------+
|Turkey | 78 | 2000 |Canada | 30 | 2000 |
+------------+------+--------+------------+------+--------+
|France | 55 | 2000 |Turkey | 78 | 2000 |
+------------+------+--------+------------+------+--------+
|Canada | 30 | 2000 |Turkey | 78 | 2000 |
+------------+------+--------+------------+------+--------+
|Turkey | 78 | 2000 |Turkey | 78 | 2000 |
+------------+------+--------+------------+------+--------+
因此,当您说展示广告A.Country
以及土耳其A.Year
在哪里时A.Country
,您可以看到它可以返回的全部是土耳其(由于唯一的1条记录)
但是,如果您选择的B.Country
是土耳其并展示A.Country
,您将获得法国,加拿大和土耳其!
问题内容: 我最近问了一个有关“自我加入”的问题,得到了一个很好的答案。 该查询用于查找事件1之后1天的事件2的ID,开始日期和价格。 该代码工作正常。 但是我不知道如何。 有人可以尽可能详尽地解释一下-查询的不同部分是什么以及它们做什么? 非常感谢您的帮助,无论出于什么原因,我都很难解决这个问题。 问题答案: 我试图理解的方式是在第一块上写出两个列表,分别标记为event1和一个event2。然
我需要在集合中返回以分页,但我只能在数组中返回,因为查询使用自然联接。如何使用Laravel集合执行此查询: 选择男性。*从mensagens自然加入(选择id_emissor,最大(created_at)created_at从mensagensid_receptor="。$user_id"集团id_emissor)t 我用过这个代码:
问题内容: 如何通过在alter上输入值来添加该列?作为示例,我想在每行上添加 tempID 的列,该列的值为“ 3” 也许是这样的 但是上面的代码仅用于时间戳,不适用于整数值。提前致谢 问题答案: 您应该查看此https://dev.mysql.com/doc/refman/5.7/en/alter- table.html 对于您的情况,它将类似于
我最初调用了数据库,并使用了Definer中的表,在它上运行一些查询,这些查询存储在dataframe'data1'中。现在我想发送包含一个新列的'data1',并更新MySQL中的非空表exdata3。 (将来我可能没有新的列/行,但与MySQL中的相同列相比,现有列在dataframe中可能有不同的值,如果您知道我的意思的话) 在MySQL中,dataframe和表之间的区别是在datafra
问题内容: 我不太确定是否由于尝试执行以下MySQL程序而关闭了与此类似的问题。 在bash命令行上并得到此错误 我该如何解决此问题? 我实际上是从Python程序运行此命令,但将其拉出以尝试在bash命令行上摆弄它。 我已经看到了如何修改my.cnf(本地文件),但是如果可以避免的话,我不希望对全局进行更改。 这是MySQL版本。 问题答案: 如“ 安全问题”中所述: 为了解决这些问题,我们更改
问题内容: 我有一个PreparedStatement,例如: 如您所见,Employee表具有一个自动递增的ID。我基本上也需要使用prepareStatement自动添加它。有人可以告诉我我要去哪里哪里并纠正我吗?现在,这只是给我一个与Statement相关的错误。 问题答案: 将该列 完全 放在语句之外。它将由数据库引擎生成。您的查询应为: __ 其次,您必须先执行插入操作,然后再从结果中取