自然连接错误

时间:2015-11-19 10:54:25

标签: mysql join

在mysql的数据库中,我有两个视图和一个表,这些是:

1)PopItaNew(查看)

+---------+---------------+------+-----+---------+-------+
| Field   | Type          | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| Eta     | int(3)        | NO   |     | NULL    |       |
| ItaliaM | decimal(32,0) | YES  |     | NULL    |       |
| ItaliaF | decimal(32,0) | YES  |     | NULL    |       |
| ItaTot  | decimal(33,0) | YES  |     | NULL    |       |
+---------+---------------+------+-----+---------+-------+

2)PopXEtaN(查看)

+--------------+------------+------+-----+---------+-------+
| Field        | Type       | Null | Key | Default | Extra |
+--------------+------------+------+-----+---------+-------+
| CodiceComune | int(6)     | NO   |     | NULL    |       |
| Eta          | int(3)     | NO   |     | NULL    |       |
| TotMaschi    | int(5)     | NO   |     | NULL    |       |
| TotFemmine   | int(5)     | NO   |     | NULL    |       |
| Tot          | bigint(12) | NO   |     | 0       |       |
+--------------+------------+------+-----+---------+-------+

3)和表Decessi

+--------------+---------------+------+-----+---------+----------------+
| Field        | Type          | Null | Key | Default | Extra          |
+--------------+---------------+------+-----+---------+----------------+
| ID           | int(5)        | NO   | PRI | NULL    | auto_increment |
| Anno         | year(4)       | NO   |     | NULL    |                |
| Mese         | int(2)        | NO   |     | NULL    |                |
| DataDecesso  | varchar(10)   | YES  |     | NULL    |                |
| Eta          | int(3)        | NO   |     | NULL    |                |
| Sesso        | enum('M','F') | NO   |     | NULL    |                |
| CodiceComune | int(6)        | NO   | MUL | NULL    |                |
| CausaInizBis | char(4)       | NO   |     | NULL    |                |
| cod_titolo   | char(5)       | NO   |     | NULL    |                |
| descr_titolo | text          | NO   |     | NULL    |                |
| cod_sez      | char(3)       | NO   |     | NULL    |                |
| descr_sez    | text          | NO   |     | NULL    |                |
| cod_cat      | char(3)       | NO   |     | NULL    |                |
| descr_cat    | text          | NO   |     | NULL    |                |
| cod_causa    | char(4)       | NO   |     | NULL    |                |
| descr_causa  | text          | YES  |     | NULL    |                |
| liv1         | text          | YES  |     | NULL    |                |
| liv2         | text          | YES  |     | NULL    |                |
| liv3         | text          | YES  |     | NULL    |                |
+--------------+---------------+------+-----+---------+----------------+

我需要一切东西UNTIL cod_titolo;

我考虑通过自然连接获得我想要的结果,因为所有视图和表都有CodiceComune和Eta列。 因此,我写了这些行的自然连接:

SELECT * FROM (PopXEtaN NATURAL JOIN PopItaNew ORDER BY CodiceComune, Eta) pop NATURAL JOIN (SELECT CodiceComune, Anno, Eta, Sesso, cod_titolo, COUNT(Eta) decessi FROM Decessi WHERE CodiceComune > 40000 AND CodiceComune < 120000 GROUP BY CodiceComune, Eta, Sesso ORDER BY CodiceComune);

但是我收到了这个错误

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') pop NATURAL JOIN (SELECT CodiceComune, Anno, Eta, Sesso, cod_titolo, COUNT(Eta' at line 1

WHILE,如果我首先创建两个视图,一个是通过自然地连接前两个视图,PopItaNew和PopXEtaN以及来自Decessi的视图,

CREATE VIEW Pop AS SELECT * FROM PopXEtaN NATURAL JOIN PopItaNew ORDER BY CodiceComune, Eta;
CREATE VIEW Morti AS SELECT CodiceComune, Anno, Eta, Sesso, cod_titolo, count(Eta) decessi FROM Decessi WHERE CodiceComune > 40000 AND CodiceComune < 120000 GROUP BY CodiceComune, Eta, Sesso ORDER BY CodiceComune;
SELECT * FROM Pop Natural JOIN Morti;
一切正常;你们有没有想过为什么会这样?

1 个答案:

答案 0 :(得分:1)

因为(PopXEtaN NATURAL JOIN PopItaNew ORDER BY CodiceComune, Eta) pop应该是子查询,但事实并非如此。在视图定义中,您将其写为带有选择部分的完整查询,这就是为什么不会出现错误的原因。

将其改写为SELECT * FROM (SELECT * FROM PopXEtaN NATURAL JOIN PopItaNew ORDER BY CodiceComune, Eta) pop...

更新:

或者,不要将其定义为子查询:

...FROM PopXEtaN NATURAL JOIN PopItaNew NATURAL JOIN (...) ORDER BY CodiceComune, Eta