2014-03-26 58 views
0

請查看this。結果顯示,確實是兩組聯合。我希望輸出如下,即No Cartesian Product。行爲不帶連接的列

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

下無投票推理! – bjan

回答

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進行更通用的處理。

0

您應該在其中加入一個或多個表的鍵的約束。如果沒有約束,它總是會導致笛卡兒積,即第一個表的行數x第二個表的行數

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