插入从Inner Join查询派生的数据时出错

时间:2015-08-18 00:37:20

标签: mysql database join inner-join

我试图查询MySQL数据库以INSERTINNER JOIN的派生输出查询到空白的第三个表中。结构如下:

表A:firstName VARCHAR(100),lastName VARCHAR(100)
表B:firstName VARCHAR(100),lastName VARCHAR(100) ),extension VARCHAR(5)
表C:firstName VARCHAR(100),lastName VARCHAR(100),extension VARCHAR(5)

表A列出了我需要与表B中的扩展名匹配的名称。表B有名称和扩展名,但我只需要这些名称和扩展名的某个子集(与表中的名字和姓氏相匹配的名称和扩展名) 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%准确的结果(我担心一些可能会丢失,而不是任何事情)。< / p>

以下查询不起作用:

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;

第二个查询返回以下错误:

ERROR 1406 (22001): Data too long for column 'extension' at row 88

我已经查看了这一点,我发现桌子可以包含长数据类型的行数最大 - 这就是为什么我将表格列修改为VARCHAR(100)VARCHAR(255)

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您要加入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有关。在修改表之前,请告诉我们表的原始模式。

更新1

如果问题中的表格架构顺序正确,SELECT语句中的记录将根据列的顺序插入到该表中。将LastName插入Extension列会导致错误。

从表架构中,您有firstNamelastNameextension 然后在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 ...