Sql 行作为列而不连接

Sql 行作为列而不连接,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,请看一看。结果表明,两个集合确实是一个连接。我希望输出如下,即没有笛卡尔积 ID_1 TYPE_1 NAME_1 ID_2 TYPE_2 NAME_2 =============================================================== TP001 1 Adam Smith TV001 2 Leon Crowell TP002 1 Ben Conrad

请看一看。结果表明,两个集合确实是一个连接。我希望输出如下,即没有笛卡尔积

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
不是强制性的。

应该对连接表的键有一些限制。如果没有约束,它将始终产生笛卡尔积,即第一个表的行数x第二个表的行数

您需要一个人工列作为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进行更通用的处理

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)

无理由投票否决!!!