MySQL从左连接表中插入一列的所有行?

时间:2014-05-05 03:15:56

标签: mysql sql-insert create-table

我在INSERT语句中遇到困难,我提供了前四列的值。第五个(最后一个)列应该连接另一个表的两列。那部分工作正常,但只有一行。这两个表都有12行(因此是12个字面值),但是我如何使连接的子查询返回所有行为我正在尝试的一列插入(从而与其他列中的值对应)?

已经尝试了很多方法,但这就是现在的样子......

    INSERT INTO properties (property_id, condo_type, pets, internet, owner_name)
      SELECT 
    '301S', '207S', '1100T', '1201S', '317T', '110S', '1010S', '409T', '505T', '1005S', '656S', '942S' AS property_id,
    'SandsOF3BR', 'SandsOF3BR', 'SandsOF2BR', 'Tides3BR', 'SandsOF2BR', 'Tides2BR', 'SandsOF2BR', 'SandsOF2BR', 'Tides2BR', 'Tides3BR', 'SandsOF2BR', 'SandsOF3BR' AS condo_type,
    1,1,0,0,0,0,0,1,1,1,1,0 AS pets,
    1,1,0,1,1,1,0,1,0,1,0,0 AS internet,
    CONCAT(owner_first_name, ' ', owner_last_name) AS owner_name
      FROM owners LEFT JOIN properties 
        ON owners.property_id = properties.property_id
      WHERE owners.property_id = properties.property_id;

所以基本上,属性表和所有者表都在各自的“property_id”列中有数据,反映哪个属性属于什么所有者。我的意思是,我是否必须创建一个循环遍历第二个表的过程,还是有更传统的方法?或者我是否会填写这个专栏?请帮忙,谢谢...... ANYBODY ??

1 个答案:

答案 0 :(得分:2)

INSERT INTO properties
            (property_id,   /*here*/
             condo_type,    /*you*/
             pets,          /*name*/
             internet,      /*5*/
             owner_name)    /*columns*/

SELECT '301S',              /*here you name way more than the 5 columns*/
       '207S',              /*from your insert statement.*/
       '1100T',              
       '1201S',             /*So, where to put them? MySQL doesn't know*/
       '317T',              /*That's why you get an error.*/
       '110S',
       '1010S',
       '409T',
       '505T',
       '1005S',
       '656S',
       '942S'                                         AS property_id,
       'SandsOF3BR',
       'SandsOF3BR',
       'SandsOF2BR',
       'Tides3BR',
       'SandsOF2BR',
       'Tides2BR',
       'SandsOF2BR',
       'SandsOF2BR',
       'Tides2BR',
       'Tides3BR',
       'SandsOF2BR',
       'SandsOF3BR'                                   AS condo_type,
       1,
       1,
       0,
       0,
       0,
       0,
       0,
       1,
       1,
       1,
       1,
       0                                              AS pets,
       1,
       1,
       0,
       1,
       1,
       1,
       0,
       1,
       0,
       1,
       0,
       0                                              AS internet,
       Concat(owner_first_name, ' ', owner_last_name) AS owner_name
FROM   owners
       LEFT JOIN properties
              ON owners.property_id = properties.property_id
WHERE  owners.property_id = properties.property_id;  

这两列

       Concat(owner_first_name, ' ', owner_last_name) AS owner_name

来自业主表?如果是,那你为什么要加入properties表呢?没有必要。

像这样写:

INSERT INTO properties
            (property_id,
             condo_type,
             pets,
             internet,
             owner_name)
SELECT 'value1',
       'value2',
       'value3',
       'value4',
       Concat(owner_first_name, ' ', owner_last_name)
FROM   owners
;  

这将从所有者(当然只有2列)中插入所有行到属性中。前4列对于每一行都是相同的,因为它们只是字符串。

如果要将静态字符串插入表中,可以编写多个语句,也可以在一个语句中指定多行,如下所示:

INSERT INTO foo (col1, col2) VALUES
(1, 2), /*first row*/
(3, 4); /*second row*/

修改

要结合这两种方法,你必须写下这样的东西:

 INSERT INTO properties
            (property_id,
             condo_type,
             pets,
             internet,
             owner_name)
SELECT 
       CASE owners.property_id WHEN 1 THEN 'value1'
                               WHEN 2 THEN 'value2'
       END AS column1,
       CASE WHEN owner_first_name = 'fancy' AND owner_last_name = 'pants' THEN 'value3'
       ELSE 'value4' END AS column2,
       Concat(owner_first_name, ' ', owner_last_name) AS owner_name
FROM   owners
       LEFT JOIN properties
              ON owners.property_id = properties.property_id
WHERE  owners.property_id = properties.property_id;  

不太实际;)