两个结果使用相同的ID在一行中

时间:2015-04-10 10:18:19

标签: sql oracle

表格结构: 水果

| fID | fName | fAmount | SpeciesID |
|-----|-------|---------|-----------|
| 1   | Apple | 22      | 1         |
| 2   | Pear  | 4       | 1         |
| 3   | Grape | 5       | 1         |

种:

| SpeciesID | SpeciesName | SpeciesPrice |
|-----------|-------------|--------------|
| 1         | Fruit       | 100          |

父:

| pID       | fID | ParentIDa | ParentIDb | Colour |
|-----------|-----|-----------|-----------|--------|
| 1         | 1   | 2         | 3         | Red    |

我想要实现的输出:

| fName | fAmount | SpeciesName | SpeciesPrice | Colour | fID | fName | SpeciesName | SpeciesPrice |
|-------|:-------:|-------------|--------------|--------|-----|-------|-------------|--------------|
| Apple |    22   | Fruit       | 100          | Red    | 2   | Pear  | Fruit       | 100          |
| Apple |    22   | Fruit       | 100          | Red    | 3   | Grape | Fruit       | 100          |

前5列用于子项,Color从Parent表中获取。 现在最重要的部分,我需要使用ParentIDa(第一个结果)和ParentIDb(第二个结果)使用Fruit表和fID再次添加到列中,然后再加入父类表的Species。

简而言之,一些水果有父母,在父表中列出,我想首先显示子信息,然后是父母1信息,第二个结果应该是相同的子信息+父母2信息。

这是我到目前为止所得到的:

SELECT  fName,fAmount,SpeciesName,SpeciesPrice,Colour,fID,sub.*
FROM Fruit f 
INNER JOIN Parent pa ON (f.fID = pa.fID) 
INNER JOIN Species s ON (a.SpeciesID = s.SpeciesID)
INNER JOIN (
    SELECT fID,fName,SpeciesID 
    FROM Fruit 
    WHERE pa.ParentIDa = f.fID) sub;

我只是无法使内部查询工作,我需要以某种方式使用输出的主要fID将其用于子查询。

4 个答案:

答案 0 :(得分:1)

认为问题是在子选择中你不能参考外部查询。尽量不要进行子选择,只需在最后一个语句中使用Fruit加入,并为此表分配另一个别名。

INNER JOIN Fruit f2 WHERE pa.ParentIDa = f2.avatarID

答案 1 :(得分:1)

我使用sqlFiddle提问,请参阅ed sqlFiddle

您的确切输出是:

SELECT f.fName,f.fAmount,s.SpeciesName,s.SpeciesPrice, p.Colour, f.fID, f.fName, s.SpeciesName, s.SpeciesPrice 
FROM Fruit f 
INNER JOIN Species s ON f.SpeciesID = s.SpeciesID
INNER JOIN Parent p ON f.fID != p.fID 

如果你想看到相同的id使用;

INNER JOIN Parent p ON f.fID = p.fID

使用时!=运算符输出为:

Pear    4   Fruit   100 Red 2   Pear    Fruit   100
Grape   5   Fruit   100 Red 3   Grape   Fruit   100

如果你使用=运算符输出是:

Apple   22  Fruit   100 Red 1   Apple   Fruit   100

编辑: ParentIDa和ParentIDb联合。

SELECT f.fName,f.fAmount,s.SpeciesName,s.SpeciesPrice, p.Colour, f.fID, f.fName, s.SpeciesName, s.SpeciesPrice 
FROM Fruit f 
INNER JOIN Parent p ON (p.ParentIDa = f.fID or p.ParentIDb = f.fID)
INNER JOIN Species s ON f.SpeciesID = s.SpeciesID;

答案 2 :(得分:0)

不是你需要的吗?

SELECT f.fName,f.fAmount,s.SpeciesName,s.SpeciesPrice, pa.Colour, f.fID, f.fName, s.SpeciesName, s.SpeciesPrice 
FROM Fruit f 
INNER JOIN Parent pa ON f.fID = pa.fID 
INNER JOIN Species s ON f.SpeciesID = s.SpeciesID
WHERE pa.ParentIDa = f.fID

SELECT f.fName,f.fAmount,s.SpeciesName,s.SpeciesPrice, pa.Colour, f.fID, f.fName, s.SpeciesName, s.SpeciesPrice 
FROM Fruit f 
INNER JOIN Parent pa ON f.fID = pa.fID AND pa.ParentIDa = f.fID
INNER JOIN Species s ON f.SpeciesID = s.SpeciesID

答案 3 :(得分:0)

谢谢大家,现在得到了答案:

SELECT f.fName,f.fAmount,s.SpeciesName,s.SpeciesPrice, p.Colour, f2.fID, f2.fName, f2.SpeciesID, s2.SpeciesName, s2.SpeciesPrice
FROM Fruit f 
INNER JOIN Species s ON f.SpeciesID = s.SpeciesID
INNER JOIN Parent p ON f.fID = p.fID
INNER JOIN Fruit f2 ON p.ParentIDa = f2.fID OR p.ParentIDb = f2.fID
INNER JOIN Species s2 ON f2.SpeciesID = s2.SpeciesID;

请参阅sqlFiddle