请查看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
不是必需的。
答案 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)