从同一个表中加入两个选择查询

mdc*_*mdc 5 sql sql-server select join

该表包含ID列,valueHeading列和值列.我想将value列分成两个名为valueHeading1和valueHeading2的新列,具体取决于valueHeading值的类型.

所以我想加入这个选择: 编辑:完全加入

SELECT ID
      ,valueHeading
      ,value as 'valueHeading1'
FROM table1
WHERE valueHeading = 'valueHeading1'
Run Code Online (Sandbox Code Playgroud)

使用此选择:

SELECT ID
      ,value as 'valueHeading2'
FROM table1
WHERE valueHeading = 'valueHeading2'
Run Code Online (Sandbox Code Playgroud)

在他们各自的身份证上.我该怎么做呢?

编辑以说明我想要做的事情:

原表:

ID    valueHeading    value
0     valueHeading1    a
0     valueHeading2    a
1     valueHeading1    ab
1     valueHeading2    NULL
2     valueHeading1    abcd
2     valueHeading2    abc
Run Code Online (Sandbox Code Playgroud)

新表:

ID    valueHeading1    valueHeading2
0          a               a
1          ab              NULL
2         abcd             abc
Run Code Online (Sandbox Code Playgroud)

xle*_*ier 5

尝试类似的东西:

SELECT ID
      , CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END AS valueHeading1
      , CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END AS valueHeading2
FROM table1
WHERE valueHeading IN ('valueHeading1', 'valueHeading2')
Run Code Online (Sandbox Code Playgroud)

如果要为每个ID重新组合一行的所有值,可以尝试:

SELECT ID
      , MAX(CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END) AS valueHeading1
      , MAX(CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END) AS valueHeading2
FROM table1
WHERE valueHeading IN ('valueHeading1', 'valueHeading2')
GROUP BY ID
HAVING MAX(CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END) IS NOT NULL
OR MAX(CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

请参见SQLFiddle.我也尝试过Oracle 11g和MSSQL 2012,它每次都有效.

  • 在确切地意识到你需要什么后,我试图回答你的问题.这是[SQL Fiddle](http://sqlfiddle.com/#!3/1a253/3)的不同之处. (2认同)

hku*_*uay 5

如果您只需要加入使用此功能.如果你不需要加入,使用优雅方式的情况.

SELECT * FROM 
    (SELECT ID
          ,valueHeading
          ,value as 'valueHeading1'
    FROM table1
    WHERE valueHeading = 'valueHeading1') AS TAB_1, 
    (SELECT ID
          ,value as 'valueHeading2'
    FROM table1
    WHERE valueHeading = 'valueHeading2') AS TAB_2
    WHERE TAB_1.ID = TAB_2.ID
Run Code Online (Sandbox Code Playgroud)


Ale*_*nko 3

在 SQLServer2005+ 中可能使用 PIVOT

SELECT ID, valueHeading1, valueHeading2
FROM
(
 SELECT *
 FROM dbo.test28
 WHERE valueHeading IN ('valueHeading1', 'valueHeading2')
 ) x
 PIVOT
 (
  MAX(value)
  FOR valueHeading IN ([valueHeading1], [valueHeading2])
  ) p
Run Code Online (Sandbox Code Playgroud)

SQLFiddle上的演示