Как выбрать внутреннее поле соединения с IF / case? - PullRequest
2 голосов
/ 07 ноября 2011

Немного сложно.

Я сейчас занимаюсь очисткой некоторых данных, но из-за размера данных это займет довольно много времени, и поэтому мне нужно приложение, чтобызапустить во время выполнения обновления.Итак, у меня есть таблица комментариев и таблица фотографий.Каждая запись комментария имеет либо photo_d_id , сохраненный в object_id , либо photo_id , сохраненный в object_id :

if comment_type = 8 then object_id = photo.photo_p_id
if comment_type = 17 then object_id = photo.photo_id

Мне нужно внутреннее соединение таблицы фотографий в запросе, но мне нужно выполнить внутреннее соединение в правильном поле из таблицы фотографий на основе comment_type .Это невозможно, но дает пример того, что я хочу сделать:

select *.comments,*.photos 
FROM comments
CASE
   when comments.comment_type = 8 then inner join photos on comments.object_id = photo.photo_p_id
   when comments.comment_type = 17 then inner join photos on comments.object_id = photo.photo_id

Есть идеи?

1 Ответ

2 голосов
/ 07 ноября 2011

Попробуйте этот запрос ( отредактировано ) -

SELECT c.*,
  CASE c.comment_type WHEN 8 THEN p1.photo_p_id WHEN 17 THEN p2.photo_id ELSE NULL END photo_id,
  CASE c.comment_type WHEN 8 THEN p1.column1 WHEN 17 THEN p2.column1 ELSE NULL END column1
FROM comments c
  LEFT JOIN photos p1
    ON c.object_id = p1.photo_p_id
  LEFT JOIN photos p2
    ON c.object_id = p2.photo_id

Еще один вариант -

SELECT c.*, p.*
FROM comments c
  JOIN photos p
    ON c.comment_type = 8 AND c.object_id = p.photo_p_id OR c.comment_type = 17 AND c.object_id = p.photo_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...