2017-02-06 95 views
0

我有一個查詢是由連接兩個select語句組成的,它返回結果作爲列A,B,C,A,B,C。這裏A,B,C是同一列的名稱,但值是不同的,因爲它是來自兩個不同查詢的結果集。現在我想爲A,B,C有兩行,而不是在兩行中都顯示一行數據。像這樣: -MySQL將列轉換爲行

至今: -

  A B C A B C 
Values X1 X2 x3 Y1 Y2 Y3 

要求: -

     A B C 
Value from table 1 X1 X2 x3 
Value from Table 2 Y1 Y2 Y3 

現在我的條件我想替代結果從表1,即一排,然後從表2的一行,然後再來自table1和table2的行等......

以下是一些示例代碼。

Select * from 
     (Select x,y,z from table1) A 
    join (Select x,y,z from table1) B on A.x = B.x and A.y = B.z and A.z = B.y 
+0

您的查詢在哪裏 –

+2

您想使用UNION ALL而不是加入 – GurV

+0

@denny - 可能的話,請檢查示例代碼。 選擇* 從 ( 選擇X,Y,Z 從表1 )甲 加入關於組Ax = Bx的 ( 選擇X,Y,Z 從表1 )乙和Ay = BZ和了Az =通過 代碼將返回來自查詢A的x,y,z列,然後從查詢B返回x,y,z列。 –

回答

0

你需要UNION ALL,儘管你的直覺相反。

由於您使用了SELECT *,您的問題的一部分可能來自列名稱混淆。專業提示:避免SELECT *

鑑於你在評論中提供的示例,你可以得到你想要的東西。

Select A.x, A.y, A.z 
    from (Select x,y,z from table1) A 
    join (Select x,y,z from table1) B on A.x = B.x and A.y = B.z and A.z = B.y 
UNION ALL 
Select B.x, B.y, B.z 
    from (Select x,y,z from table1) A 
    join (Select x,y,z from table1) B on A.x = B.x and A.y = B.z and A.z = B.y 

你不喜歡這樣:

SELECT a1 a, b1 b, c1 c FROM t 
    UNION ALL 
SELECT a2 a, b2 b, c2 c FROM t 

t被定義爲一個複雜的結構化查詢。這會讓你的生活變得有點複雜,因爲你會重複這個查詢兩次得到你想要的結果?爲什麼? MySQL沒有公共表表達式。

您可能想要定義t作爲一種視圖,以保存一些輸入。或者您可能想要使用臨時表,尤其是如果生成t的查詢非常耗時。

+0

感謝您在問題中進行編輯。現在我的疑問是,如果我使用Union All,我是否能夠交替得到最終結果?正如我在最初的問題已經提到,我想 A.x,A.y,A.z B.x,B.y,B.z A.x,A.y,A.z B.x,B.y,B.z 如果是,那麼如何? –

+0

SQL中沒有默認的排序*。除非一個查詢包含ORDER BY子句,否則結果集的排序是*形式上不可預知的。*如果您依賴於沒有ORDER BY子句的排序,那麼這就是計算機科學術語*,您會很抱歉。不解釋你的原始結果集應該如何訂購。 –

+0

感謝您的線索。我創建了Temp表,用於在A和B中存儲值,然後使用UNION ALL使用排名功能提取備用記錄。 –