插入从内部联接查询派生的数据时出错
Error inserting data derived from Inner Join query
我正在尝试查询 MySQL 数据库以 INSERT
从 INNER JOIN
导出的输出到空白的第三个 table。结构如下:
Table A:firstName
VARCHAR(100),lastName
VARCHAR(100)
Table B:firstName
VARCHAR( 100), lastName
VARCHAR(100), extension
VARCHAR(5)
Table C: firstName
VARCHAR(100), lastName
VARCHAR (100), extension
VARCHAR(5)
Table A 有名称列表,我需要匹配 Table B 中的扩展名。Table B 有名称和扩展名,但我只需要其中的某个子集名称和扩展名(与 Table A 中的名字和姓氏匹配的名称)。
我能够 运行 成功进行以下查询;但是,我不确定我是否相信 42 行的输出:
SELECT ta.extension, da.firstName, da.lastName
FROM <tableB> AS ta
INNER JOIN <tableA> AS da
ON (ta.firstName=da.firstName)
INNER JOIN <tableA> AS dl
ON (ta.lastName=dl.lastName)
ORDER BY da.firstName;
此查询有效,但同样,我不能肯定它为我提供了 100% 准确的结果(我担心可能会遗漏一些结果,最重要的是)。
以下查询不起作用:
INSERT INTO <tableC>
SELECT ta.extension, da.firstName, da.lastName
FROM <tableB> AS ta
INNER JOIN <tableA> AS da
ON (ta.firstName=da.firstName)
INNER JOIN <tableA> AS dl
ON (ta.lastName=dl.lastName)
ORDER BY da.firstName;
第二次查询returns出现如下错误:
ERROR 1406 (22001): Data too long for column 'extension' at row 88
我查了一下,发现 table 可以包含长数据类型的行数有一个硬性最大值 - 这就是为什么我将 table 列修改为是 VARCHAR(100)
,低于 VARCHAR(255)
。
有什么想法吗?
您将加入 Table A
两次。您应该只执行一次,这样您就可以从 Table B
中获取过滤后的记录,这些记录具有来自 Table A
中的相应记录
SELECT ta.extension, da.firstName, da.lastName
FROM <tableB> AS ta
INNER JOIN <tableA> AS da ON ta.firstName = da.firstName AND ta.lastName = da.lastName
ORDER BY da.firstName;
对于ERROR 1406 (22001): Data too long for column 'extension' at row 88
错误,是的,它与值的length
有关。请向我们展示您的 table 在修改之前的原始架构。
更新 1
如果您问题中的 table 模式顺序正确,SELECT
语句中的记录将根据列的顺序插入到 table 中。该错误是由于将 LastName
插入 Extension
列引起的。
从 table 架构中,您有 firstName
、lastName
和 extension
然后在 SELECT
语句中,我们应该遵循相同的顺序:
INSERT INTO <tableC>
SELECT da.firstName, da.lastName, ta.extension
FROM ...
另一种选择是在 INSERT INTO
语句中指定列名
INSERT INTO <tableC> (Extension, FirstName, LastName)
SELECT ta.extension, da.firstName, da.lastName
FROM ...
我正在尝试查询 MySQL 数据库以 INSERT
从 INNER JOIN
导出的输出到空白的第三个 table。结构如下:
Table A:firstName
VARCHAR(100),lastName
VARCHAR(100)
Table B:firstName
VARCHAR( 100), lastName
VARCHAR(100), extension
VARCHAR(5)
Table C: firstName
VARCHAR(100), lastName
VARCHAR (100), extension
VARCHAR(5)
Table A 有名称列表,我需要匹配 Table B 中的扩展名。Table B 有名称和扩展名,但我只需要其中的某个子集名称和扩展名(与 Table A 中的名字和姓氏匹配的名称)。
我能够 运行 成功进行以下查询;但是,我不确定我是否相信 42 行的输出:
SELECT ta.extension, da.firstName, da.lastName
FROM <tableB> AS ta
INNER JOIN <tableA> AS da
ON (ta.firstName=da.firstName)
INNER JOIN <tableA> AS dl
ON (ta.lastName=dl.lastName)
ORDER BY da.firstName;
此查询有效,但同样,我不能肯定它为我提供了 100% 准确的结果(我担心可能会遗漏一些结果,最重要的是)。
以下查询不起作用:
INSERT INTO <tableC>
SELECT ta.extension, da.firstName, da.lastName
FROM <tableB> AS ta
INNER JOIN <tableA> AS da
ON (ta.firstName=da.firstName)
INNER JOIN <tableA> AS dl
ON (ta.lastName=dl.lastName)
ORDER BY da.firstName;
第二次查询returns出现如下错误:
ERROR 1406 (22001): Data too long for column 'extension' at row 88
我查了一下,发现 table 可以包含长数据类型的行数有一个硬性最大值 - 这就是为什么我将 table 列修改为是 VARCHAR(100)
,低于 VARCHAR(255)
。
有什么想法吗?
您将加入 Table A
两次。您应该只执行一次,这样您就可以从 Table B
中获取过滤后的记录,这些记录具有来自 Table A
SELECT ta.extension, da.firstName, da.lastName
FROM <tableB> AS ta
INNER JOIN <tableA> AS da ON ta.firstName = da.firstName AND ta.lastName = da.lastName
ORDER BY da.firstName;
对于ERROR 1406 (22001): Data too long for column 'extension' at row 88
错误,是的,它与值的length
有关。请向我们展示您的 table 在修改之前的原始架构。
更新 1
如果您问题中的 table 模式顺序正确,SELECT
语句中的记录将根据列的顺序插入到 table 中。该错误是由于将 LastName
插入 Extension
列引起的。
从 table 架构中,您有 firstName
、lastName
和 extension
然后在 SELECT
语句中,我们应该遵循相同的顺序:
INSERT INTO <tableC>
SELECT da.firstName, da.lastName, ta.extension
FROM ...
另一种选择是在 INSERT INTO
语句中指定列名
INSERT INTO <tableC> (Extension, FirstName, LastName)
SELECT ta.extension, da.firstName, da.lastName
FROM ...