作为没有加入的列的行

时间:2014-03-26 05:57:55

标签: sql oracle oracle11g

请查看this。结果显示,实际上是两组的连接。我希望输出如下,即没有笛卡尔积。

ID_1    TYPE_1  NAME_1          ID_2    TYPE_2  NAME_2
===============================================================
TP001   1       Adam Smith      TV001   2       Leon Crowell
TP002   1       Ben Conrad      TV002   2       Chris Hobbs
TP003   1       Lively Jonathan 

我使用了一个解决方案join,我知道选择行作为列,但我需要所需格式的结果,而join不是必需的。

3 个答案:

答案 0 :(得分:0)

您应该加入一些或多个表的约束。如果没有约束,它将始终产生笛卡尔积,即第一个表的行数x第二个表的行数

答案 1 :(得分:0)

您需要一个人工列作为ID。对两种类型的教师都使用rownum。 因为您不知道是否有更多类型1或类型2的教师,您必须执行完全外部联接以组合这两个集。

SELECT *
  FROM (SELECT ROWNUM AS cnt, teacherid
             , teachertype, teachername
          FROM teachers
         WHERE teachertype = 1) qry1
       FULL OUTER JOIN (SELECT ROWNUM AS cnt, teacherid
                             , teachertype, teachername
                          FROM teachers
                         WHERE teachertype = 2) qry2
          ON qry1.cnt = qry2.cnt

通常,数据库会按行而不是列进行思考。在你的例子中,你很幸运 - 你只有两种类型的教师。对于每种新类型的教师,您必须更改语句并附加完整的外部联接,以便以特殊方式显示查询的输出 - 每列一组。

但是通过简单的选择,您可以检索相同的信息,无论您拥有多少教师类型,它都能正常运行。

SQL在呈现数据方面有些限制,我会将其留给客户端重新获取数据或使用PL / SQL获得更通用的方法。

答案 2 :(得分:0)

SELECT TONE.TEACHERID ID_1, TONE.TEACHERTYPE TYPE_1, TONE.TEACHERNAME NAME_1
      ,TTWO.TEACHERID ID_2, TTWO.TEACHERTYPE TYPE_2, TTWO.TEACHERNAME NAME_2
FROM 
(SELECT TEACHERID, TEACHERTYPE, TEACHERNAME FROM TEACHERS WHERE TEACHERTYPE = 1)
  TONE
FULL OUTER JOIN
(SELECT TEACHERID, TEACHERTYPE, TEACHERNAME FROM TEACHERS WHERE TEACHERTYPE = 2)
  TTWO
ON TONE.TEACHERID = REPLACE(TTWO.TEACHERID,'TV','TP');

ID_1    TYPE_1  NAME_1          ID_2    TYPE_2  NAME_2
=====   ======  ======          ======  ======  ======
TP001   1       Adam Smith      TV001   2       Leon Crowell
TP002   1       Ben Conrad      TV002   2       Chris Hobbs
TP003   1       Lively Jonathan (null)  (null)  (null)

http://www.sqlfiddle.com/#!4/c58f3/28