【问题标题】:SQL Query: For each item add multiple valuesSQL 查询:为每个项目添加多个值
【发布时间】:2017-02-15 15:56:31
【问题描述】:

如何编写一个 SQl 查询来使用 Table1 和 Table2 创建“NewTable”,结果看起来像下面的“NewTable”?

   Table1   
 EmmployeeID
|     1     |
|     2     |
|     3     |

  Table2
 AgencyID
|   a    |
|   b    |
|   c    |

              NewTable
      |EmmployeeID|AgencyID|
      |     1     |   a    |
      |     1     |   b    |
      |     1     |   c    |
      |     2     |   a    |
      |     2     |   b    |
      |     2     |   c    |
      |     3     |   a    |
      |     3     |   b    |
      |     3     |   c    |     

【问题讨论】:

  • 您是否希望创建一个包含 EmmployeeID 和 AgencyID 的所有可能组合的表?
  • 你在这里实际使用的是什么数据库?有时 SQL 的语法略有不同,例如,从 Oracle 到 SQL Server 到 MySQL 到 Informix。只标记重要的数据库供应商——它会帮助人们给你一个更好的答案!

标签: mysql sql sql-server oracle informix


【解决方案1】:

使用CROSS APPLYCROSS JOIN。例如,

declare @a table (a int)
declare @b table (b char(1))

insert @a values (1),(2)
insert @b values ('a'),('b')

select * from @a cross apply @b order by a

【讨论】:

    【解决方案2】:

    通过对CROSS JOINTable1Table2 执行CROSS JOIN 创建第三个表,然后INSERT 的值

    CREATE TABLE NewTable
    ( 
      EmployeeID int,
      AgencyID varchar,
    );
    
    INSERT INTO NewTable
    select EmployeeID, AgencyID
    from Table1 CROSS JOIN Table2
    

    【讨论】:

    • 感谢您节省了我的时间。
    【解决方案3】:

    尝试使用

    CREATE TABLE NewTable
    select EmmployeeID,AgencyID 
    from Table1,Table2
    

    【讨论】:

    • 使用逗号分隔的表名不是一个好方法。显式使用交叉连接要好得多。当然,这取决于实际的 DBMS,这可能是也可能不是有效的语法。
    【解决方案4】:

    组合两个表通常意味着JOIN

    生成每个可能的行组合(“配对”)通常意味着“笛卡尔积”,也称为CROSS JOIN,如下所示:

    select EmployeeID, AgencyID
    from Table1 CROSS JOIN Table2
    

    【讨论】:

    • 为了创建新表CREATE TABLE NEWTABLE SELECT...
    • 不同供应商创建新表的语法不同。由于OP指定了4个供应商,我请他先澄清一下......
    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2010-09-21
    相关资源
    最近更新 更多