Объединение 2 таблиц с разным количеством строк - PullRequest
1 голос
/ 05 октября 2011

У меня проблема с объединением 2 таблиц с разным количеством строк. Я пробовал 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

Ответы [ 2 ]

3 голосов
/ 05 октября 2011
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 = 17 из WHERE в предложение ON добавит строку NULL с правой стороны, если совпадения нет, вместо ее устранения.

(Правка) Альтернативный метод:

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)
2 голосов
/ 05 октября 2011

Вы были правы, что вам нужен LEFT JOIN.Но когда вы выполняете (LEFT) OUTER JOIN, любое условие WHERE в правой таблице отменяет внешнее соединение.

Решение состоит в том, чтобы переместить условие относительно (справа) table2 (table2.ID_advertentie = 17 один) из предложения WHERE до ON:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...