2010-08-06 57 views
0

我有一个SQL语法问题。SQL语法连接表

这里是我的表:

default_caps: 
+-------+------------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+-------+------------+------+-----+---------+----------------+ 
| idx | int(11) | NO | PRI | NULL | auto_increment | 
| tab | int(11) | NO |  | NULL |    | 
| cap | tinyint(1) | NO |  | 0  |    | 
| value | double  | YES |  | NULL |    | 
+-------+------------+------+-----+---------+----------------+ 

convertEntries: 
+----------------+------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+----------------+------------+------+-----+---------+----------------+ 
| idx   | int(11) | NO | PRI | NULL | auto_increment | 
| convertTable | int(3)  | NO |  | 0  |    | 
| convertEntry | int(2)  | NO |  | 0  |    | 
| cap   | tinyint(1) | NO |  | 1  |    | 
| capTable  | int(2)  | NO |  | 1  |    | 
+----------------+------------+------+-----+---------+----------------+ 

我想选择convertEntries行,结果中的每一行中,我想包括default_caps.value这样default_caps.tab等于convertEntries.capTable,和default_caps.cap等于convertEntries.cap。

所以,如果default_caps看起来是这样的:

+-----+-----+-----+---------+ 
| idx | tab | cap | value | 
+-----+-----+-----+---------+ 
| 1 | 1 | 0 | 8650.75 | 
| 2 | 1 | 1 |  50 | 
| 3 | 1 | 7 |  350 | 
| 2 | 2 | 0 | 9000 | 
| 2 | 2 | 1 |  100 | 
| 3 | 2 | 7 |  200 | 
+-----+-----+-----+---------+ 

而且convertEntries看起来像这样(省略了一些列):

+-----+----------+-----+ 
| idx | capTable | cap | 
+-----+----------+-----+ 
| 1 |  1 | 1 | 
| 2 |  1 | 1 | 
| 3 |  1 | 1 | 
| 4 |  1 | 1 | 
| 5 |  1 | 1 | 
| 6 |  1 | 1 | 
| 7 |  1 | 7 | 
| 8 |  1 | 7 | 
| 9 |  1 | 7 | 
| 10 |  1 | 0 | 
| 11 |  1 | 0 | 
| 12 |  1 | 0 | 
+-----+----------+-----+ 

我想这样的结果:

+-----+----------+-----+---------+ 
| idx | capTable | cap | value | 
+-----+----------+-----+---------+ 
| 1 |  1 | 1 |  50 | 
| 2 |  1 | 1 |  50 | 
| 3 |  1 | 1 |  50 | 
| 4 |  1 | 1 |  50 | 
| 5 |  1 | 1 |  50 | 
| 6 |  1 | 1 |  50 | 
| 7 |  1 | 7 |  350 | 
| 8 |  1 | 7 |  350 | 
| 9 |  1 | 7 |  350 | 
| 10 |  1 | 0 | 8650.75 | 
| 11 |  1 | 0 | 8650.75 | 
| 12 |  1 | 0 | 8650.75 | 
+-----+----------+-----+---------+ 

谢谢!

回答

3
SELECT convertEntries.idx, convertEntries.capTable, convertEntries.cap, 
    default_caps.value 
FROM convertEntries 
LEFT JOIN default_caps 
    ON convertEntries.cap = default_caps.cap 
    AND convertEntries.capTable = default_caps.tab 
-1
select 
    a.idx, 
    a.cap, 
    a.capTable, 
    b.Value 
from convertEntries a 
inner join default_caps b on a.tab = b.captable 
          and a.cap = b.cap 
+1

内连接是一个坏主意,在这里,因为他不会没有在默认表中的相应值获得的行。 – JNK 2010-08-06 19:44:55

1

这是一个简单的加入,依我看

From ConvertEntries e 
    Left Join default_caps c on e.tab=c.captable and e.cap=c.cap 

我做它作为一个左连接,因为架构很可能有数据的问题。如果您内部连接并且default_caps中不存在适当的查找,则该记录将被忽略。

0

我会建议使用更有意义的列名,但是:

SELECT convertEntries.idx 
    , convertEntries.capTable 
    , convertEntries.cap 
    , default_caps.value 
FROM convertEntries 
    INNER JOIN default_caps 
    ON default_caps.tab = convertEntries.capTable 
     AND default_caps.cap = convertEntries.cap