/ / Zapytanie SQL, aby uzyskać wartości domyślne, jeśli tłumaczenia nie zostały znalezione - sql, hsqldb

Zapytanie SQL, aby uzyskać wartości domyślne, jeśli tłumaczenia nie zostały znalezione - sql, hsqldb

Oto moje tabele:

Product:
ID PRICE NAME    DESCRIPTION
1  100   laptop  laptop_desc
2  200   mouse   mouse_desc

Product_Translations:
PID  LANG NAME DESCRIPTION
1    ch   伊吾  伊吾伊吾

Nie martw się o nazwę i opis w tabeli produktów. Zachowujemy ją, aby uniknąć dołączania, jeśli użytkownik wybierze domyślny język.

Teraz muszę napisać zapytanie, aby uzyskać wszystkie produkty Produkt zgodnie z językiem użytkownika z funkcją rezerwową, która nie zawiera tłumaczenia nazwy i opisu Product_Translations zabrać je Produkt stół. Próbowałem kilku różnych sposobów, ale nie mogłem tego zrobić. Aktualizacja:


Wymagam wszystkich kolumn z tabeli produktów (ww tym przykładzie dałem tylko 2, ale moja aktualna tabela ma więcej kolumn). I jeszcze jedno ograniczenie polega na tym, że muszę wygenerować to zapytanie za pomocą interfejsu API kryteriów JPA, więc wszelkie słowa kluczowe SQL nieobsługiwane przez WZP mogą nie działać dla mnie.

Dzięki za pomoc.

Odpowiedzi:

0 dla odpowiedzi № 1
SELECT p.ID, p.Price,
COALESCE(pt.Name, p.Name) Name,
COALESCE(pt.Description, p.Description) Description
FROM Product p
INNER JOIN User u on u.ID = @MyUserID
LEFT JOIN Product_Translations pt ON pt.PID = p.ID AND pt.LANG = u.LANG

0 dla odpowiedzi nr 2

W twoim przypadku powinieneś użyć LEFT JOIN

SELECT p.ID, p.PRICE, ISNULL(pt.NAME,p.NAME) AS NAME, p.DESCRIPTION
FROM Product AS p
LEFT JOIN Product_Translations AS pt ON p.ID = pt.PID
WHERE pt.LANG = @UserLang

ISNULL w hsqldb http://hsqldb.org/doc/guide/builtinfunctions-chapt.html#bfc_general_functions


0 dla odpowiedzi № 3

Użyj LEFT OUTER JOIN:

SELECT
p.id
,p.price
,ISNULL(t.name, p.name) AS translation
,ISNULL(t.description, p.description) AS description
FROM Product p
LEFT JOIN Translations t
ON p.id = t.pid
AND t.lang = ?

To zadziała na serwerze SQL, jeśli użyjesz innej zmiany bazy danych do COALESCE ().