单行子查询返回多行 - 真正的解决方案

时间:2016-08-08 14:45:22

标签: sql oracle

我会很快。

问题:我的子查询返回多行(这是好的,因为它应该返回多个,或只返回一个),并触发ora错误1427,关闭查询结果

问题:如何显示此子查询的所有寄存器?

备注

  • 我在互联网上的所有搜索都说你可以限制1,但这不是我真正想要的。

  • D表就像一个矩阵,我给FIELD4一个特定的值,它将FIELD返回给我。在同一个查询中,我对FIELD4有另一个值,并在FIELD上返回另一个类型和业务结果。

 SELECT (SELECT B.Value
                FROM TABLE_B B
             WHERE B.FIELD1 = A.FIELD1
                 AND B.FIEL2 = A.FIELD2
                 AND B.FIELD3 = A.FIELD3
                 AND B.Category= 'Adress') AS RESULT_FIELD,
         (SELECT B.Value
                FROM TABLE_B B
             WHERE B.FIELD1 = A.FIELD1
                 AND B.FIEL2 = A.FIELD2
                 AND B.FIELD3 = A.FIELD3
                 AND B.Category= 'Gender') AS RESULT_FIELD2
FROM TABLE_A A;

表格示例:

Table A   

ID   Name      Age    
1    Lapras     6    
2    Lincon     45


Table B    

ID   A_ID    Category      Value    
1      1       Gender      Female    
2      2       Gender      Male    
3      1       Adress      Avenue one    
4      1       Adress      Avenue Two    
5      2       Adress      Avenue Eleven

正如你所看到的,它在B上有多个注册表,我需要在结果表中显示所有地址,考虑到我传递给类别colunm的情况。

代码已更新*

结果应该是:

ID Name    Age Gender   Adress 
1  Lapras  6   Female   Avenue one
1  Lapras  6   Female   Avenue two
2  Lincon  45  Male     Avenue eleven

2 个答案:

答案 0 :(得分:3)

为什么要使用子查询?这是一个简单的JOIN

SELECT B.FIELD as RESULT_FIELD
FROM TABLE_A A JOIN
     TABLE_B B
     ON B.FIELD1 = A.FIELD1 AND
        B.FIEL2 = A.FIELD2 AND
        B.FIELD3 = A.FIELD3 AND
        B.FIELD4 = 'SOMETHING';

答案 1 :(得分:2)

获得所需的结果(根据您的示例输入/输出)需要使用JOIN,以及多个类别的一些逻辑。以下是使用您引用的两个类别(genderadress)的一个可能示例:

SELECT A.ID, A.Name, A.Age, B1.Value as Gender, B2.Value as Address
FROM TABLE_A A
LEFT OUTER JOIN TABLE_B B1 ON B1.A_ID = A.ID AND B1.Category = 'Gender'
LEFT OUTER JOIN TABLE_B B2 ON B2.A_ID = A.ID AND B2.Category = 'Adress';

请注意,您最终得到了类别值的笛卡尔积。例如,如果有人为第一个类别输入了两个值(可能不是针对性别而是另一个),而第二个输入了两个值,则会得到4个结果 - 每个排列的结果(每个排列2个类别x 2个值)类别)。即便如此,这种查询方式似乎也是您正在寻找的。