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)
无理由投票否决!!!