在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;
一切正常;你们有没有想过为什么会这样?
答案 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