我的文字翻译表如下:
表:待办事项
day | text_id
-------------
0 | 1
1 | 2
1 | 1
表:翻译
lang | text_id | text
---------------------
deu | 1 | Laufen
eng | 1 | Running
eng | 2 | Swimming
现在我想用德语(deu)查找我的待办事项。我的问题是,我没有翻译(例如)text_id 2:用德语游泳。
我的默认查询是:
SELECT todos.day, translations.text
INNER Join translations
ON todos.text_id = translations.text_id
WHERE translations.locale = 'deu';
我会得到:
day | text
--------------
0 | Laufen
1 | Laufen
但我想:
day | text
--------------
0 | Laufen
1 | Swimming
1 | Laufen
如何获得一些缺失的行?首先,我应该获得所有需要的行:
SELECT todos.day, translations.text
INNER Join translations
ON todos.text_id = translations.text_id
WHERE translations.locale = 'deu' or translations.locale = 'eng';
然后删除所有重复的'eng'但是 - 如何?
对不起这个可怕的标题,我不知道如何恰当地描述它......
答案 0 :(得分:2)
您需要SELECT td.day, coalesce(tdeu.text, teng.text) as text
FROM todos td left join
translations tdeu
ON td.text_id = tdeu.text_id and tdeu.locale = 'deu' left join
translations teng
ON td.text_id = teng.text_id and teng.locale = 'eng';
将所有记录保存在第一个表中。然后你需要两次来获得默认的英文记录:
public class TEST_Table extends JFrame {
private PPControl ppc;
private EntryFilePM epm;
private JTable entryTable;
private JPanel entryTablePanel;
private JButton addButton;
private JButton saveButton;
private JButton loadButton;
private JPanel buttonsPanel;
private JLabel kursl;
private JTextField kurst;
private JLabel cnumberl;
private JTextField cnumbert;
private JLabel namel;
private JTextField namet;
private JLabel datel;
private JTextField datet;
private JLabel addressl;
private JTextField addresst;
private JLabel pdatestl;
private JTextField pdatestt;
private JLabel pdateendl;
private JTextField pdateendt;
private JLabel roadl;
private JTextField roadt;
private JLabel studyfl;
private JTextField studyft;
private JLabel naprl;
private JTextField naprt;
private JLabel ratingl;
private JTextField ratingt;
private JLabel averagel;
private JTextField averaget;
private JLabel profl;
private JTextField proft;
private JLabel pbasel;
private JTextField pbaset;
private JLabel homel;
private JTextField homet;
private JPanel horriblePanel;
private JButton saveEntryButton;
private JButton cancelEntryButton;
private JPanel entryButtonsPanel;
private JPanel entryEditPanel;
int idCounter = 1;
public static void main(String[] args) throws EntryExistsException {
try {
new TEST_Table();
} catch (IOException e) {
e.printStackTrace();
}
}
public int getIdCounterNext(){
return idCounter++;
}
public TEST_Table() throws IOException, EntryExistsException {
super("TEST");
ppc = new PPControl();
initialize();
}
private void initialize() {
setSize(1200,800);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setLayout(new BorderLayout());
createEntryTable();
createButtonsPanel();
createEntryTab();
add(entryTablePanel,BorderLayout.CENTER);
add(entryEditPanel, BorderLayout.WEST);
add(buttonsPanel, BorderLayout.SOUTH);
this.setVisible(true);
this.pack();
}
private void createEntryTable() {
final Vector<String> columns = new Vector<String>();
columns.add("Std");
columns.add("Contr #");
columns.add("Name");
columns.add("Birth dt");
columns.add("Address");
columns.add("Pr date start");
columns.add("Pr date end");
columns.add("Road");
columns.add("Std form");
columns.add("№ way");
columns.add("Rating");
columns.add("Avrg");
columns.add("Prof");
columns.add("Pr base");
columns.add("Home");
final EntryTableModel entryModel = new EntryTableModel(ppc.giveAllEntry(), columns);
entryTable = new JTable();
entryTable.setModel(entryModel);
entryTable.setShowGrid(true);
// entryTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// entryTable.getSelectionModel().addListSelectionListener(new TableSelectionListener());
JScrollPane entryScrollPane = new JScrollPane(entryTable);
entryTablePanel = new JPanel();
entryTablePanel.setLayout(new GridLayout());
entryTablePanel.add(entryScrollPane, BorderLayout.CENTER);
entryTablePanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
}
private void createButtonsPanel() {
addButton = new JButton("Add");
saveButton = new JButton("Save");
saveButton.addActionListener(new ButtonsListener());
loadButton = new JButton("Load");
loadButton.addActionListener(new ButtonsListener());
buttonsPanel = new JPanel();
buttonsPanel.setLayout(new GridLayout(1, 3));
buttonsPanel.add(addButton);
buttonsPanel.add(saveButton);
buttonsPanel.add(loadButton);
}
private void createEntryTab(){
JLabel kursl = new JLabel ("kurs");
kurst = new JTextField();
//otherlabels/tfields
JLabel ratingl = new JLabel("rating.double");
ratingt = new JTextField();
JLabel averagel = new JLabel("average.double");
averaget = new JTextField();
JLabel profl = new JLabel("profession");
proft = new JTextField();
JLabel pbasel = new JLabel("prak.base");
pbaset = new JTextField();
JLabel homel = new JLabel("home");
homet = new JTextField();
horriblePanel = new JPanel();
JScrollPane horribleScrollPane = new JScrollPane(horriblePanel);
horriblePanel.setLayout(new GridLayout(15,2));
// horriblePanel.add(horribleScrollPane, BorderLayout.CENTER);
horriblePanel.add(kursl);
horriblePanel.add(kurst);
//other labels/tfields
horriblePanel.add(homel);
horriblePanel.add(homet);
saveEntryButton = new JButton("Save");
saveEntryButton.addActionListener(new ButtonsListener());
cancelEntryButton = new JButton("Cancel");
entryButtonsPanel = new JPanel();
entryButtonsPanel.setLayout(new GridLayout());
entryButtonsPanel.add(saveEntryButton);
entryButtonsPanel.add(cancelEntryButton);
entryEditPanel = new JPanel();
entryEditPanel.setLayout(new GridLayout());
entryEditPanel.add(horriblePanel);
entryEditPanel.add(entryButtonsPanel);
}
class TableSelectionListener implements ListSelectionListener {
@Override
public void valueChanged(ListSelectionEvent e) {
int rowIndex = -1;
if (e.getSource().equals(entryTable.getSelectionModel())
&& entryTable.getSelectedRow() != -1) {
rowIndex = entryTable.convertRowIndexToModel(entryTable
.getSelectedRow());
EntryTableModel em = (EntryTableModel) entryTable.getModel();
Entry entry = em.giveEntryInRow(rowIndex);
}
}
}
class ButtonsListener implements ActionListener{
public void actionPerformed(final ActionEvent ae) {
if(ae.getSource().equals(addButton)){
}
if (ae.getSource().equals(saveButton)){
try {
epm.exportTable(entryTable);
} catch (IOException e) {
e.printStackTrace();
}
}
if(ae.getSource().equals(loadButton)){
try {
epm.importTable("C:/test.xls");
} catch (BiffException | IOException | ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ae.getSource().equals(saveEntryButton)) {
Calendar c = new GregorianCalendar();
int studyYear = 23;// Integer.parseInt(kurst.getText());
int contractNumber = getIdCounterNext();
contractNumber++;// Integer.parseInt(cnumbert.getText());
String stname = "Uano";// namet.getText();
Date birthDate = c.getTime();
// birthDate = epm.convertToDate(datet.getText());
String address = "abc asd fg 123";// addresst.getText();
Date practiceDateStart = c.getTime();
// practiceDateStart = epm.convertToDate(pdatestt.getText());
Date practiceDateEnd = c.getTime();
// practiceDateEnd = epm.convertToDate(pdateendt.getText());
String railway = "bad road";// roadt.getText();
String studyForm = "bad form";// studyft.getText();
int directionNumber = 1232; // =
// Integer.parseInt(naprt.getText());
double rating = 3.4;// Double.parseDouble(ratingt.getText());
double average = 4.5;// Double.parseDouble(averaget.getText());
String profession = "fcki";// proft.getText();
String practiceBase = "fckh";// pbaset.getText();
String inhabitation = "fckf2";// homet.getText();
try {
ppc.addEntry(studyYear, contractNumber, stname, birthDate,
address, practiceDateStart, practiceDateEnd, railway,
studyForm, directionNumber, rating, average,
profession, practiceBase, inhabitation);
for (Entry e : ppc.giveAllEntry()) {
System.out.println(e.getContractNumber());
System.out.println(e.getName());
System.out.println(e.getBirthDate());
}
final EntryTableModel em = (EntryTableModel) entryTable.getModel();
System.out.println("a");
em.setDataVector(ppc.giveAllEntry());
entryTable.updateUI();
System.out.println("b");
} catch (EntryExistsException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
}