Newsgroup: it.comp.lang.visual-basic
Titolo: DATABASE: Selezionare COMUNQUE almeno un campo

Ragazzi uso MySql 4.1, vorrei sapere: che query posso scrivere per 
selezionare un campo da una tabella e, nel caso il recordset restituito 
sia vuoto, ricevere COMUNQUE un recordset con un valore (ad es. il 
valore 0)?
-- 
Quando noi ignoranti eravamo di più,
tutto era più bello...
(Adriano Celentano)

 (ad es. il valore 0)?
Se usi una query, e le condizioni di where fanno sì che nessun Record sia
estratto, il RecordSet è necessariamente vuoto.
Non riesco a capire cosa tu intenda per "Valore di un Recordset", immagino
tu intendessi un Record con tutti i campi impostati ad un valore
predefinito.
Diciamo che, in questo caso, puoi effettuare un Left Outer Join fra una
tabella con un solo record (ad esempio una 'finta' select che crei tu, una
vista, o quello che vuoi) e la vera e propria query.
Non ricordo esattamente con MySql se per utilizzare una query come tabella
basta metterla fra parentesi, o se serve qualcosa tipo OpenQuery,
OpenRowSet, ecc...
Ovviamente dalla tabella con un solo record non estrarrai alcun campo, visto
che è fittizia.
Invece, nei campi che ti interessano della tua query, dovrai inserirli tutti
all'interno di un Coalesce (o IsNull, non ricordo in MySql), inserendo come
secondo valore il valore di default che ti interessa.
In questo modo, se il where non fa passare niente, il Left Outer Join ti
crea comunque un record, ma con tutti i campi NULL. Tu, però, avendo
inserito i Coalesce, modifichi tutti i Null nei valori di default, et voilà.
Ciao
Alberto

 crei tu, una vista, o quello che vuoi) e la vera e propria query.
[SNIP]
Se invece interessa avere un recordset che, pur non avendo record, abbia la
struttura della tabella interrogata si puo' utilizzare
SELECT * FROM Tabella WHERE 0<>0
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 join corretto fra le due tabelle :)
Per quanto ho capito stai impostando male il problema:
La tabella master è quella che tu stai usando a destra della join (la
seconda per intenderci) per cui ovviamente se in quella a sinistra non ci
sono record non ne avrai per nessuna delle due.
Ciao
-- 
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Ciao
Ciauz

 In questo caso, un bel IFNULL a capo SELECT mi darà quello che voglio.
Sai che non ho capito niente? :)
Ma non puoi fare una semplice
SELECT * FROM tabella1 LEFT JOIN tabella2 ON tabella1.campo = tabella2.campo
WHERE quellochetiserve
???


 Se omettevo "ON ..." mi dava errore di sintassi.
E perchè omettevi l'ON?
Io intendevo una cosa del genere:
select Coalesce(B.Campo,'Valore_di_Default') AS Campo
from (Select Pippo=1) as A
left outer join TABELLA as B
on A.Pippo=1
where data_ora>'20031020'
Ciao
Alberto

Il problema principale era:
-----
Ho una tabella che possiede tre colonne: un ID autoincrementante, Data 
di tipo DATE e Bloccato che č un Enum('0', '1').
Come posso fare a selezionare dalla tabella il campo BLOCCATO scegliendo 
in base alla data e - nel caso il recordset restituito sia vuoto - 
ottenere COMUNQUE un record con il campo BLOCCATO=0?
-----
La risposta di Albe č stata:
Fai un LEF JOIN tra una tabella fittizia (che non esiste) che abbia UN 
solo elemento, e la tua tabella.
In questo modo otterrai COMUNQUE un recordset con un elemento.
Giostrando con IFNULL di MySql puoi settare i campi in modo da assegnare 
il valore standard che desidero nel caso di un recordset vuoto.
E io ho fatto cosě.
La mia tabella fittizia da usare per il left join č una tabella chiamata 
appunto fittizia, il cui unico campo č un campo DATE, il cui valore č 
proprio la data che mi serve ricercare nella tabella dei blocchi (quella 
principale che ho descritto sopra).
Comunque se rileggi il thread forse il filo del discorso torna...

 where data_ora>'20031020'
UH?
Io pensavo che la clausola ON dovesse comunque mettere in relazione un 
campo per ognuna delle due tabelle interessate.
Cavolo...
Questo non lo sapevo. Controllo da prompt come va questa tecnica...

Funzia :)
Grazie :D :D :D
Un'altra cosa imparata!!!

 campo per ognuna delle due tabelle interessate.
Devi fare mente locale su come si facevano i Join 'vecchio stile': un
brutale prodotto cartesiano delle tabelle, filtrando in Where i record
(composti unendo i campi delle due tabelle) che non soddisfano il join. Poi
si metteva in AND quello che adesso sta nel Where.
Perfetto per gli Inner Join, ma assolutamente inefficace per i Left, Right o
Full outer join, dove occorreva fare un Union All e creare delle tabelle con
dei campi NULL *manualmente*.
Allora nasce l'ON.
Che, per gli inner join, è da un punto di vista logico in tutto e per tutto
un Where (anzi, a volte è meglio mettere nell'ON le condizioni di Where, e
si hanno prestazioni migliori).
Per gli Outer Join, la funzione di On è diversa dal Where, in quanto assomma
le funzionalità di un Union All con quelle del Where.
Se riesci a visualizzare mentalmente la logica che ho tentato brutalmente di
spiegare sopra, ti si aprirà un mondo di possibilità, con i Join.
Ciao
Alberto

Praticamente mi dici che la ON ha le stesse funzionalità di una WHERE: 
solo che non filtra i record da selezionare ma le regole da rispettare 
per creare il JOIN.
Fatta eccezione per gli INNER JOIN in cui fa da WHERE vero e proprio...
E se faccio:
SELECT A.Campo1, A.CampoN, B.CampoX
FROM A LEFT JOIN B
ON B.CampoX=B.CampoX
Cosa mi viene fuori? o_O
Ora vado di fretta e non ho tabelle disponibili sul mio pc (formattato 
due giorni fa e con pochissime cose installate).
A lavoro ci provo.

 ON B.CampoX=B.CampoX
...forse un prodotto cartesiano?
Caxxo che curiosità... non vedo l'ora di poter provare...

 ...forse un prodotto cartesiano?
Esatto.
Puoi anche scrivere "On 1=1"
Ciao
Alberto
--
"Non mi sembra piů granda del Delfino..."
"A partir dal fat che la merda liquida
l'as drisa gnan a puntlarla,
cňsta chě l'č piň granda, gnuranta."