Внутреннее объединение, только если поле не пустое - PullRequest
11 голосов
/ 12 мая 2011

Я мог бы сделать то, что я хочу, с двумя запросами, но я хочу сделать это только с одним.

На самом деле у меня есть 4 таблицы с:

Table 1 : id, sub-id
Table 2 : id, sub-id
Table 3 : id, login
Table 4 : id, login

Я делаюзапрос вроде этого:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
   Table3.login, Table4.login FROM Table1
   INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id)
   INNER JOIN Table3 ON (Table3.id = Table1.id)
   INNER JOIN Table4 ON (Table4.id = Table1.id)
   WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid"

Я хочу присоединиться Table3 только если id не пусто, если оно пустое, я присоединяюсь Table4.

У вас естьесть идеи, пожалуйста?

Я слышал, что может помочь левое соединение, но я не настолько привык к этим ключевым словам, так что ...?

Ответы [ 5 ]

9 голосов
/ 12 мая 2011

Как сказано в других ответах, вы можете использовать левое соединение. Вы также можете добавить оператор case , чтобы иметь только один столбец login:

SELECT 
    Table1.id, 
    Table1.sub-id, 
    Table2.id, 
    Table2.sub-id, 
    CASE 
        WHEN Table3.id IS NOT NULL THEN Table3.login
        ELSE Table4.login
    END CASE AS login
FROM Table1
INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id)
LEFT JOIN Table3 ON (Table3.id = Table1.id)
LEFT JOIN Table4 ON (Table4.id = Table1.id)
WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid"
5 голосов
/ 12 мая 2011

Использовать левое соединение:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
Table3.login, Table4.login FROM Table1
INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id)
LEFT JOIN Table3 ON (Table3.id = Table1.id)
LEFT JOIN Table4 ON (Table4.id = Table1.id)
WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid"

Затем строки из Таблицы3 и Таблицы4 будут объединены, если есть совпадение. В противном случае это будет NULL. Затем вы можете проверить результаты и использовать данные из Таблицы3, если она есть, или из Таблицы 4. В противном случае.

2 голосов
/ 12 мая 2011

Если для любого table1.id, или только table3.id или только table4.id будет соответствовать, вы можете использовать это:

SELECT
    Table1.id
  , Table1.sub-id
  , Table2.id
  , Table2.sub-id
  , COALESCE(Table3.login, Table4.login)
    AS login

FROM Table1
  INNER JOIN
     Table2 ON (Table1.id = Table2.id
            AND Table1.sub-id = Table2.sub-id)
  LEFT JOIN
     Table3 ON (Table3.id = Table1.id)
  LEFT JOIN
     Table4 ON (Table4.id = Table1.id)

WHERE Table1.id = "my_id"
  AND Table1.sub-id = "my_subid"
2 голосов
/ 12 мая 2011

Попробуйте что-то вроде этого:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
    COALESCE(Table3.login, Table4.login) AS login
FROM Table1
INNER JOIN Table2 ON Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id
LEFT JOIN Table3 ON Table3.id = Table1.id
LEFT JOIN Table4 ON Table4.id = Table1.id
WHERE Table1.id = 'my_id' AND Table1.sub-id = 'my_subid'

Я удалил ненужный паретензис, чтобы уменьшить беспорядок. Также обратите внимание, что стандартным разделителем строк в SQL является одиночная кавычка.

2 голосов
/ 12 мая 2011

Это может помочь:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
   Table3.login, Table4.login FROM Table1
   INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id)
   LEFT JOIN Table3 ON (Table3.id = Table1.id)
   LEFT JOIN Table4 ON (Table4.id = Table1.id)
   WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...