我试图查询MySQL数据库以INSERT
将INNER 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)
。
有什么想法吗?
答案 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
列会导致错误。
从表架构中,您有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 ...