2010-07-05 83 views
2

有沒有更好的方法來編寫這個SQL查詢?加入表格本身

SELECT *, (SELECT TOP 1 columnB FROM mytable WHERE mytable.columnC = T1.columnC ORDER BY columnD) as firstRecordOfColumnB 
FROM 
    (SELECT * FROM mytable WHERE columnA = 'apple') as T1 

請注意,columnC不是主鍵。

+1

您的加盟條件沒有做任何有用的,因爲它是在同一個表相同的字段,除非它是一個非唯一列,那麼你基本上只是選擇一個隨機行返回。你確定這是你的意思嗎? – Donnie 2010-07-05 12:05:32

+0

這是我的錯誤,將其命名爲keyColumn。 我有一個表與許多記錄與列C相同的值。 我想返回一個特定的行加上第一條記錄中的一些列,並使用與columnC相同的值。 – homam 2010-07-07 06:38:12

+0

只要您未定義訂單,就不會有'第一個'記錄。獲得「第一」記錄背後的想法究竟是什麼?它需要什麼? – 2010-07-07 06:50:30

回答

2

如果KeyColumns內確實是一個鍵列(即唯一的),比查詢可以definitly寫更多優雅和有效地...

SELECT 
    *, columnB 
FROM 
    mytable 
WHERE 
    columnA = 'apple' 
+0

+1。我不得不制定一個例子來注意到... – 2010-07-05 12:25:08

+0

columnB將成爲*我猜的一部分?如果你不希望columnB到最後,你可以簡單地寫下:* – 2010-07-05 14:24:14

+0

沒有抱歉,把它命名爲keyColumn是個錯誤。這不是主要關鍵。 – homam 2010-07-07 06:38:57

0

這可能是在性能的情況下更好地:

SELECT 
    *, 
    (TOP 1 myLookupTable.columnB FROM mytable AS myLookupTable WHERE myLookupTable.keyColumn = mytable.keyColumn) as firstRecordOfColumnB 
FROM 
    mytable 
WHERE 
    columnA = 'apple' 

但對於TOP 1部分,我不知道有什麼更好的解決方案。

編輯: 如果keyColumn是獨一無二的,在firstRecordOfColumnB數據將是相同mytable.columnB。 如果它不是唯一的,至少你需要排序的數據來獲得相關的TOP 1,例如:

SELECT 
    *, 
    (TOP 1 myLookupTable.columnB FROM mytable AS myLookupTable WHERE myLookupTable.keyColumn = mytable.keyColumn 
    ORDER BY myLookupTable.sortColumn) as firstRecordOfColumnB 
FROM 
    mytable 
WHERE 
    columnA = 'apple' 
+0

thx。我不知道我可以像這樣使用AS: SELECT ... FROM mytable AS myLookupTable ... 是的,我沒有加入主鍵。但表已經排序。 – homam 2010-07-07 06:43:38

+0

不客氣。如果您認爲它解決了您的問題,請將此標記爲答案:) – 2010-07-07 21:50:21