2010-07-05 84 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