2016-03-17 20 views
0

我有兩個表SQL Union從第一個表中的所有別名?

[數據] - 標題,製造商,partnum,價格

[交叉] - 產品(data.partnum),標題,製造商,partnum,價格

我想要什麼通過sysn編號列出所有產品。我怎樣才能與工會得到的所有數據,如與排序 - >

  1. [數據表]微軟, 「一些注意事項」,9989,$ 20
  2. [交叉表]微軟經銷商, 「一些注意事項」,1045 ,$ 30
  3. [交叉表]蘋果經銷商在微軟:), 「一些注意事項」,2233,$ 40
  4. 虛擬間隔:)
  5. [數據表]微軟, 「一些注意事項」,9989,$ 20
  6. [十字表]微軟聯想轉銷商..

林本

SELECT `title`,'Microsoft' AS `maker`,`partnum`,`price` 
    FROM data as d 
    WHERE sysn=%s 
    GROUP BY partnum 
UNION ALL 
    SELECT `title`,`maker`,`partnum`,`price` 
    FROM cross as c 
    WHERE c.product=d.partnum 
    GROUP BY `partnum` 

感謝

回答

0

這並不完全清楚你在問什麼。考慮在http://sqlfiddle.com中設置示例模式和數據。

「虛擬間隔」將會非常混亂。這不完全不可能,只是凌亂。

對於以特定順序返回行,您將需要添加ORDER BY子句。

你不明白你爲什麼包括GROUP BY條款。第一個SELECT上的GROUP BY將有效「摺疊」示例輸出行1和5.對於partnum,給定相同的值9989。如果沒有解釋爲什麼你需要GROUP BY,我會猜測你真正打算的是ORDER BY條款。

它也不清楚爲什麼文字值'Microsoft'需要出現在SELECT名單中,地方從datamaker列。這樣做沒有什麼無效的SQL。但是如果沒有解釋,它就沒有多大意義。

我們應該問的問題......爲什麼需要這個特定的結果?是否有不同的結果更容易實現,哪些會同樣滿足要求?

撇開「虛擬間隔」行,從查詢返回這樣看來似乎滿足大多數規範:

SELECT t.src 
    , t.title 
    , t.maker 
    , t.partnum 
    , t.price 
    FROM (
     SELECT '[data]'   AS `src` 
       , d1.title   AS `title` 
       , d1.maker   AS `maker` 
       , d1.partnum  AS `partnum` 
       , d1.price   AS `price` 
       , d1.partnum  AS `product` 
      FROM data d1 
      WHERE d1.sysn = ? 

      UNION ALL 

     SELECT '[cross]' 
       , c2.title 
       , c2.maker 
       , c2.partnum 
       , c2.price 
       , c2.product 
      FROM cross c2 
      JOIN data d2 
      ON d2.partnum = c2.product 
      WHERE d2.sysn = ? 
     ) 
ORDER BY t.product DESC, t.src DESC, t.price ASC 
0

想如果你正在使用MySQL,「跨界」是保留字,則必須用反引號交叉使用它作爲表名( backtick接下來是左上方鍵盤上的'1')。

+0

非常感謝你的人,特別是具有對spencer7593。代碼,你提供的工作很棒! – Strogi

相關問題