Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

SQL , SQLite Jak korzystać z wirtualnych tablic

p_zag 07 Feb 2011 21:01 2996 6
  • #1
    p_zag
    Level 14  
    Witam
    Zwracam się z prośbą o pomoc jak tworzyć tablice tymczasowe w pamięci RAM komputera, i jak je odczytywać. Mam bazę danych w SQLite i osadzoną w javie (tu korzystam ze sterownika -> sqlite-jdbc-3.7.2.jar) i to mi działa. Czyli mogę tworzyć, modyfikować, usuwać całe tabele jak i poszczególne rekordy(wiersze).
    Chciałbym stworzyć tabele w pamięci RAM komputera, w której mógłbym umieścić wybrane kolumny z kilku różnych tabel. Następnie wynik zapytania na tej "wirtualnej" tabeli wpisać do excela (jak zrobić wpis tabeli do excela wiem, tu korzystam ze sterownika -> jxl.jar).

    Na przykład mam trzy tabele w mojej bazie danych:


    CREATE TABLE Table1 (A TEXT ,B TEXT) // pobieram kolumne A
    (2 wiersze)

    CREATE TABLE Table2 (A TEXT ,B TEXT, C TEXT, D TEXT) // pobieram kolumne C
    (3 wiersze)

    CREATE TABLE Table3 (A TEXT ,B TEXT, C TEXT) // pobieram kolumne B
    (5 wierszy)




    Następnie wykonuje polecenie tabeli – widoku (w SQLite tabele stworzone przez CREATE TEMP VIEW służą tylko do odczytu) :


    CREATE TEMP VIEW TableView AS SELECT t1.kolumnaA AS kolumnaView1 , t2.kolumnaC AS kolumnaView2, t3.kolumnaB AS kolumnaView3 FROM Table1 t1 , Table2 t2 , Table3 t3 ;


    No i tu mam problem. Po odczytaniu tabeli ' TableView ' zapytaniem

    SELECT * FROM TableView ;

    tworzy mi się bardzo dużo wierszy (o wiele za dużo), choć ilość i nazwy kolumn są takie jakie miały być.
    Bardzo bym prosił o jakiś prosty przykład jak uzyskać pożądaną ilość wierszy. W tym wypadku chciał bym żeby w tabeli ' TableView ' było 5 wierszy :
    kolumnaView1 – 2 wiersze zapisane i reszta wierszy pustych,
    kolumnaView2 – 3 wiersze zapisane i reszta wierszy pustych,
    kolumnaView3 – 5 wierszy zapisane i brak pustych wierszy.

    Z góry dziękuje za wszystkie podpowiedzi i przykłady

    Piotr
  • #2
    Dżyszla
    Level 42  
    bo mnożysz... połączenia tabel to rozbudowa wszerz, a nie wzdłuż. Jeśli chcesz dołączać kolejne rekordy z kolejnych tabel posłuż się słowem UNION ALL (nie wiem, czy SQL Litle obsługuje).
    Jeśli chodzi o wynik taki, jakby położyć je obok siebie, to niestety może się nie dać.
  • #3
    p_zag
    Level 14  
    Dziękuje za podpowiedź.
    W opisie SQlite jaki posiadam niestety nie znalazłem słowa UNION ALL.
  • #4
    marcinj12
    Level 40  
    A czy między tymi 3 tabelami jest jakaś zależność? Występują między nimi klucze obce?
  • #5
    p_zag
    Level 14  
    między tymi 3 tabelami niema żadnej zależności (ja dopiero poznaje SQLite), jestem otwarty na jakiekolwiek sugestie - w sobotę tę moją bazę będę testował.
  • Helpful post
    #6
    marcinj12
    Level 40  
    Poznajesz SQLite konkretnie czy SQL w ogóle? Bo nie wiem czy szukasz sugestii "jak zrobić to w SQLite", czy "jak projektować bazę żeby potem coś się dało z niej wyciągnąć" :) Możesz podać konkretny przykład co te 3 tabele miały by zawierać? Czy polecenia LEFT JOIN i JOIN są Ci znane?

    Bo z tego co piszesz, to najbliżej byłoby do takiego zapytania:
    Code: sql
    Log in, to see the code
    ,
    co w wyniku daje:
    SQL , SQLite Jak korzystać z wirtualnych tablic
    ale musisz mieć wspólną kolumnę (A) w 3 tabelach, i wiedzieć która ma najwięcej wierszy (tabela 3).
  • #7
    p_zag
    Level 14  
    Chciałem iść na skróty przez SQLite, ale widzę że tak się mi nie uda i będę jeszcze się musiał pouczyć .
    Co do LEFT JONT i JONT to znalazłem. Cytuję:

    Zapytanie zostanie wykonane na jednej lub wielu tabelach określonych po słowie kluczowym FROM. Jeśli nazwy tabel oddzielone zostały przecinkami, w zapytaniu użyte zostanie złączenie krzyżowe różnych tabel. Używając składni instrukcji JOIN, można także określić sposób, w jaki zostaną złączone tabele. Jedynym obsługiwanym typem złączeń zewnętrznych jest LEFT OUTER JOIN. Wynikiem wyrażenia z klauzulą ON w argumentach argumenty_złączenia musi być wartość logiczna. Podzapytanie ujęte w nawiasy może zostać użyte jako tabela w klauzuli FROM. Klauzula FROM może zostać pominięta; w tym wypadku wynikiem będzie pojedynczy wiersz zawierający wartości listy wyrażenia wynik.

    Dziękuje za przykład na pewno w sobotę będę go testował - dla mnie to nauka, ale i przyjemność
    Tabele zawierają tekst, ja tworzę je tak:

    CREATE TABLE IF NOT EXISTS Tabela (kolumna1 VARCHAR(50), kolumna2 VARCHAR(50), kolumna3 VARCHAR(50));

    //-----------------------------------------------------------------------
    Jak już wcześniej pisałem dzisiaj (tj. w sobotę 12.02.2011) przetestowałem "wirtualną" tabelę według wskazówek kolegi 'marcinj12' i działa mi wyśmienicie tak jak chciałem.
    Jako wspólną kolumnę wszystkich tabel wykorzystuje dodatkową kolumnę w której zapisuje kolejny numer ROWID, który SQLite sam przydziela (oczywiście po odpowiednim przetworzeniu tego numeru). Co do tabeli o największej liczbie wierszy to mam stworzoną specjalną procedurę która przegląda wszystkie tabele podając ich faktyczną ilość wierszy