2011-10-05 44 views
1

我在连接两个不同行数的表格时遇到问题。我试过LEFT JOIN,但它不起作用,我想这是因为ID_advertentie连接两个不同行数的表格

查询:

SELECT * FROM table1 
LEFT JOIN table2 ON table1.ID_kenmerk = table2.ID_kenmerk 
WHERE table1.categorie = 1 AND table2.ID_advertentie = 17 

我怎么能写一个查询与如下表所示例子中提到的结局?

Table 1 
ID_kenmerk  Categorie  Naam_kenmerk Plaatje_kenmerk Data_type 
1   -  1  - Kenmerk a - plaatje1.gif - INT 
2   -  1  - Kenmerk b - plaatje2.gif - BOOL 
3   -  1  - Kenmerk c - Plaatje3.jpg - INT 
4   -  1  - Kenmerk d - plaatje4.jpg - VARCHAR 
5   -  2  - Kenmerk F - plaatje1.gif - INT 
6   -  2  - Kenmerk G - plaartje2.gif - VARCHAR 

Table 2 
ID_kenmerk_data  ID_kenmerk  ID_advertentie  value 
1    -  1  -  17   - Test1 
2    -  2  -  17   - Test2 
3    -  3  -  17   - Test3 
4    -  1  -  23   - lala1 
5    -  2  -  23   - lala2 
6    -  3  -  23   - ajdk2 

结果查询(WHERE ID_advertentie = 17!)

ID_kenmerk Naam_kenmerk  value 
1   - Kenmerk a - Test1 
2   - Kenmerk b - Test2 
3   - Kenmerk c - Test3 
4   - Kenmerk d - NULL 
+5

为ID_kenmerk 4,ID_advertentie不是17 ... –

回答

2

你是对的,你需要一个LEFT JOIN。但是,当您执行(LEFTOUTER JOIN时,右表上的任何WHERE条件都会取消外部联接。

解决方案是将关于(右)的条件table2(在table2.ID_advertentie = 17一个)从WHEREON条款:

SELECT * 
FROM table1 
LEFT JOIN table2 
    ON table1.ID_kenmerk = table2.ID_kenmerk 
    AND table2.ID_advertentie = 17    --- this condition moved 
WHERE table1.categorie = 1 
+0

通过35秒打我! –

3
SELECT * 
FROM table1 
LEFT JOIN table2 ON table1.ID_kenmerk = table2.ID_kenmerk AND table2.ID_advertentie = 17 
WHERE table1.categorie = 1 

刚想说你WHERE子句中使用什么都可以也可以在ON条款中使用。但将table2.ID_advertentie = 17WHERE移动到ON子句将在右侧添加一个NULLed行,如果没有匹配而不是消除它。

(编辑)的另一种方法:

SELECT * 
FROM table1 
LEFT JOIN table2 ON table1.ID_kenmerk = table2.ID_kenmerk 
WHERE table1.categorie = 1 AND (table2.ID_kenmerk_data IS NULL OR table2.ID_advertentie = 17) 
相关问题