Newsgroup: it.comp.appl.access
Titolo: [aiuto] Si puo' fare con una query?

Ciao a tutti,
dovrai fare quanto segue ma non so se la cosa e' scrivibile con una sola
query.
Ho una tabella (principale) cosi' fatta:
ID |  nome  | cognome ....
1     david      pinuc
2     daniele    biret
3     dario       pomigle
...
E in un'altra tabella (secondaria) alcuni dati di interesse:
idi | ID
12   1
12   10
Dalla prima tabella devo recuperare i record relativi agli ID che compaiono
nella sola seconda tabella, in altre parole qualcosa del tipo:
SELECT * FROM principale WHERE ID=1 OR ID=10 (che sono gli ID relativi a
idi=12).
Poiche' non so a priori i valori 1 e 10, come faccio a dire "enumerami tutti
gli ID nella tabella secondaria e recuperami i record relativi nella
pincipale"???
Spero di essermi riuscito a spiegare...
GRAZIE!

"Via" <viaseg...@SPAMdespammed.com> ha scritto nel messaggio
news:N05uc.79741$Qc.31...@twister1.libero.it...

Ciao,
basta mettere in JOIN le due tabelle, è l'essenza dell' SQL
---------------------------
SELECT Principale.*
FROM Principale
    INNER JOIN secondaria
    ON Principale.ID=Secondaria.ID
--------------------------
oppure in modo meno performante
--------------------------
SELECT *
FROM Principale
WHERE ID IN (SELECT ID From Secondaria)
---------------------------
oppure se può essere più comprensibile (ma non usare questa antica sintassi)
--------------------------
SELECT Principale.*
FROM Principale,Secondaria
WHERE Principale.ID=Secondaria.ID
---------------------------
Ciao Giorgio

 ---------------------------
Forse questa: perche' l'ID da secondaria va estratto con una SELECT FROM
WHERE.
Provero' se fa al caso mio, grazie!

"Via" <viaseg...@SPAMdespammed.com> ha scritto nel messaggio
news:Lo7uc.27154$Wc.9...@twister2.libero.it...

ciao, tutte e tre fanno esattamente la stessa cosa, la più veloce in termini
di prestazioni è la prima.
Ciao Giorgio

 di prestazioni è la prima.
Effettivamente finche' si tratta di SELECT credo di poterlo fare anche con
un JOIN, ma se ad es. dovessi fare qualcosa del genere pare non funzionare:
INSERT INTO prf_1 (domid,id) VALUES (1,ID) WHERE ID IN (SELECT ID FROM
tuple_irrisolte)
Si puo' fare una cosa del genere?
Su la documentazione di Sql server trovo anche una soluzione piu' complessa,
ma non capisco dove andrebbe inserito l'INSERT:
DECLARE @CursorVar CURSOR
SET @CursorVar = CURSOR SCROLL DYNAMIC
FOR
SELECT LastName, FirstName
FROM Northwind.dbo.Employees
WHERE LastName like 'B%'
OPEN @CursorVar
FETCH NEXT FROM @CursorVar
WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM @CursorVar
END
CLOSE @CursorVar
DEALLOCATE @CursorVar
Grazie.

 ma non capisco dove andrebbe inserito l'INSERT:
Impara prima l'Sql , i cursori di Sqlserver sono l'ultima spiaggia da
utilizzare proprio nel caso che non ci sia un'altra soluzione e in ogni caso
quelli che hai visto funzionano solo con Sql Server, ogni RDBMS ha i suoi.
Ciao Giorgio

> ci mancherebbe altro
Il problema e' che non trovo un tutorial valido di SQL per vedere query di
questo tipo, leggermente piu' complesse della classica SELECT o del classico
INSERT. Anche sul sito del W3cschool trovo solo l'SQL base.
Ne approfitto per un altro quesito se sai come aiutarmi: sto scrivendo del
codice java che fa poi delle query sul DB, e quando parte l'applicazione se
le tabelle cercate non esistono dovrebbe crearle... c'e' un modo, che tu
sappia, di fare una verifica se la tabella esista o meno. Il semplice
accesso alla tabella ovviamente genera un eccezione SQL e quindi un errore.
Grazie, e buonanotte.

"Via" <viaseg...@SPAMdespammed.com> ha scritto nel messaggio
news:WoPuc.84130$Qc.33...@twister1.libero.it...

Ciao,
puoi gestire l'errore o interrogare il database in modo appropriato a
seconda del tipo.
Per Sql Server puoi interrogare la vista INFORMATION_SCHEMA.TABLES
-------------------
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
  AND TABLE_NAME='TuaTabella'
--------------------
Per Access puoi interrogare l'insieme tabledefs dell'oggetto Database
esempio in Access
--------------------
  Dim tb As Variant
    For Each tb In CurrentDb.TableDefs
        If 
tb.name
 = "Tu Tabella" Then
           MsgBox "Trovata"
        End If
    Next
-------------------
per altri tipi di Db bisogna documentarsi.
Ciao Giorgio