SQL使用行中的值创建不同的列

时间:2013-02-07 18:43:14

标签: sql select join multiple-columns

我的数据库中有几个表,想要从几个表中选择几个列,这很好。现在,有一个第3个表,这个表中有一个列中包含不同的文本值,但是对于不同的用户来说只有几个“text_values”,例如:

表3

row userid  text_value  value
1   user1   text1       value1
2   user1   text2       value2
3   user2   text1       value3
4   user3   text1       value4
...

现在,我想从Table2中的Table1,INFO3和INFO4中获取INFO1和INFO2,但是我想从Table3中获取text_value = text1的所有值,并使用INFO5将其作为第5列,然后从中获取值表3其中text_value = text2并使其成为带有INFO 6的第6列。

我有以下查询,如果我只需要INFO5列,则可以正常工作:

SELECT Table1.INFO1, Table1.userid , Table2.INFO2,
Table1.INFO3, Table2.INFO4,
Table3.value AS INFO5
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.userid = Table2.userid 
LEFT OUTER JOIN Table3 ON Table1.userid = Table3.userid 
WHERE Table3.text_value = 'text1' 

但是,我希望使用同一个table3 VALUE列中的值创建另一个列,但是当TEXT_VALUE ='text2'时(对于'text3','text4'都是如此,因为有几个文本要“过滤” “上)。

当我将查询更改为以下内容时,它不起作用:

SELECT Table1.INFO1, Table1.userid , Table2.INFO2,
Table1.INFO3, Table2.INFO4,
Table3.value AS INFO5 WHERE Table3.text_value = 'text1' 
Table3.value AS INFO6 WHERE Table3.text_value = 'text2' 
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.userid = Table2.userid 
LEFT OUTER JOIN Table3 ON Table1.userid = Table3.userid 

任何指导都将不胜感激。

3 个答案:

答案 0 :(得分:1)

你需要CASE

SELECT  Table1.INFO1, 
        Table1.userid, 
        Table2.INFO2,
        Table1.INFO3, 
        Table2.INFO4,
        CASE WHEN Table3.text_value = 'text1' THEN Table3.value END AS INFO5 
        CASE WHEN Table3.text_value = 'text2' THEN Table3.value END AS INFO6 
FROM Table1 
LEFT OUTER JOIN Table2 
    ON Table1.userid = Table2.userid 
LEFT OUTER JOIN Table3 
    ON Table1.userid = Table3.userid 

答案 1 :(得分:0)

您的where语句位于错误的位置。它应该在加入之后:

主SQL语法应为:

SELECT Table1.INFO1, Table1.userid , Table2.INFO2,
Table1.INFO3, Table2.INFO4,
Table3.value AS INFO5 
Table3.value AS INFO6 
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.userid = Table2.userid 
LEFT OUTER JOIN Table3 ON Table1.userid = Table3.userid 
WHERE Table3.text_value = 'text1' 
and Table3.text_value = 'text2' 

答案 2 :(得分:0)

case语句的替代方法是使用Pivot功能,如果你想在没有不必要的连接的情况下向表3添加更多Info#,它将允许你扩展。

http://sqlfiddle.com/#!3/789c8/1