2012-05-08 26 views
5

Mam tabelę, która zawiera kolumnę, która działa jako "flaga", która jest używana do decydowania, z której tabeli pobierać dodatkowe informacje (tj. Wartość 1 pobiera z tabeli 1, 2 z tabeli 2 itd.). Zwykle chciałbym po prostu dołączyć do tabeli za pomocą indeksów/kluczy. Jednak tabela, do której mogłem się przyłączyć, zawierała informacje, które można znormalizować w osobne tabele, co pozostawia mnie do tej sytuacji użycia kolumny, aby zdecydować, do której tabeli się przyłączyć.Optymalizacja SQL - Dołącz do różnych tabel na podstawie wartości kolumny

Oto moje pytanie: jaki jest najskuteczniejszy sposób łączenia różnych tabel na podstawie wartości uzyskanej w tej kolumnie?

Oto dwa sposoby, w jaki wiem, jak wykonać to zadanie. Jestem całkiem pewny, że są one zarówno nie optymalne rozwiązanie:

  1. Pull informacji z moim głównym stole (zawierających wartość kolumny, które decyduje, które stół do przyłączenia), a następnie za pośrednictwem kodu w mojej aplikacji wysłać dodatkowe zapytania do uzyskać resztę informacji.

  2. Dołącz do szalonego, zwróć kolumny każdego stołu (nawet jeśli nie są używane). Następnie, za pomocą mojego kodu, zignoruj ​​puste tabele, które nie są potrzebne.

+2

Co powiesz na punkt 1. Ale umieść go na procedurze przechowywanej, a nie na kodzie aplikacji. –

Odpowiedz

1

Zdecydowanie nie opcja 2. Jeśli nie potrzebujesz danych, nie pobieraj ich. Prosty. Byłoby niewiarygodnie nieefektywne dołączanie do tabel (szczególnie dużych), gdy nie potrzebujesz danych. Możesz przejść do opcji 1 lub użyć dynamicznego SQL do zbudowania zapytania. Następnie wstawiłbym kilka przypadków testowych i uruchomiłbym plan wykonania, aby zobaczyć, jak działa twoje zapytanie.

1

W zależności od zawartości innych tabel, proponuję UNION - zwracane kolumny muszą być takie same z każdego zapytania. Więc można zrobić coś takiego:

SELECT table1.title, tabel2.text FROM table1 INNER JOIN table2 ON table1.id=table2.id WHERE table1.key='2' 
UNION 
SELECT table1.title, tabel3.text FROM table1 INNER JOIN table3 ON table1.id=table3.id WHERE table1.key='3' 

(Poprawianie SQL, aby upewnić się, że pasuje do schematu, i rzeczywiście, aby uniknąć błędów, które zostały dodane w)

+0

Każda tabela ma różne kolumny, z wyjątkiem kluczy/indeksów, których użyję do połączenia tabel razem, gdy tylko dowiem się, której tabeli użyć. – user1110302

+0

W takim przypadku, myślę, że będziesz musiał wykonać wiele zapytań, po jednym dla każdej tabeli. Choć może być możliwe CAST wierszy z każdego stołu, więc wszystkie są w tym samym typem? – andrewsi

+0

uwaga z tabelami tymczasowymi, których nie można używać w podkwotach/związkach więcej niż raz w mysql – tipu

1

myślę, że jest to możliwe:

create table a (id integer, flag boolean); 
create table b (id integer, value_b varchar(30)); 
create table c (id integer, value_c varchar(30)); 

insert into a values (1, true), (2, false); 
insert into b values (1, 'Val 1'), (2, 'Val 2'); 
insert into c values (1, 'C 1'), (2, 'C 2'); 

select a.id, 
     case when a.flag then b.value_b else c.value_c end AS value 
    from a 
    left join b using (id) 
    left join c using (id); 

Możesz try it out.

Oczywiście są tam ograniczenia:

  • liczba kolumn jest stała, więc należy udać się do NULL s jeśli niektóre wartości powinny być pominięte;
  • będziesz musiał napisać CASE ... END dla każdej kolumny;
  • powinieneś znać wszystkie połączone tabele z góry;
  • wydajność może nie być najlepsza.
+0

Dziękuję za odpowiedź, ale to zdecydowanie nie zadziała w mojej sprawie.W takim przypadku kolumny będą się różnić w każdej tabeli, a jak wspomniano inne, pozostawienie łączenia innych tabel i niewykorzystywanie niektórych informacji natychmiast doprowadzi do zniszczenia wydajności. – user1110302

Powiązane problemy