Два языка в базе данных: (английский и итальянский)
word_id word language
1 day eng
2 mister eng
3 cat eng
4 paper eng
1 giorno ita
2 signor ita
3 gatto ita
Мне нужно выбрать все слова: итальянское слово, если слово существует, а если нет - английское слово. Все вместе, это должно быть четыре слова (3 ita + 1 eng)
Это должно получить то, что вы хотите:
SELECT DISTINCT
w1.word_id
, Word = COALESCE(w2.word, w3.word)
, [Language] = COALESCE(w2.[Language] , w3.[Language] )
FROM words w1
LEFT JOIN words w2 ON w2.word_id = w1.word_id AND w2.[Language] = 'ita'
LEFT JOIN words w3 ON w3.word_id = w1.word_id AND w3.[Language] = 'eng'
Объяснение дается комментариями внутри SQL. Объедините Union all
клеи 2 результирующих набора с одинаковым количеством колоний вместе.
CREATE TABLE Table1 ('word_id' int, 'word' varchar(6), 'language' varchar(3));
INSERT INTO Table1
('word_id', 'word', 'language')
VALUES
(1, 'day', 'eng'), (2, 'mister', 'eng'), (3, 'cat', 'eng'),
(4, 'paper', 'eng'),
(1, 'giorno', 'ita'), (2, 'signor', 'ita'), (3, 'gatto', 'ita')
Запрос:
( -- this selects all the italian words
select word
from Table1
where language = 'ita'
)
union all
( -- this selects all words with ids that are not in the ita, if you have a
-- third language they would be selected as well
select word
from Table1 engWrd
where not exists ( -- this ensures same id is not given by 'ita'
select 1
from Table1
where engWrd.word_id = word_id
and language = 'ita'
)
)
Результат:
word
giorno
signor
gatto
paper