Foro oficial de SQL

la de Artanis19 esta mala.
select *
from (

SELECT DISTINCT AGENDA.CICLO, AGENDA.PERIODO, AGENDA.GEN_LIBROS, AGENDA.IMP_LIBROS, AGENDA.TOMA_LECT, AGENDA.DIGIT_LECT, AGENDA.CRITICA,
AGENDA.EN_INF_CRIT, AGENDA.CALC_CONS, AGENDA.LIQUIDACION, AGENDA.IMP_FACT, AGENDA.VENCIMIENTO, CICLOS.USUARIOS, CICLOS.ORDEN
FROM AGENDA, CICLOS

Código:
SELECT DISTINCT AGENDA.CICLO, AGENDA.PERIODO, AGENDA.GEN_LIBROS, AGENDA.IMP_LIBROS, AGENDA.TOMA_LECT, AGENDA.DIGIT_LECT, AGENDA.CRITICA, 
AGENDA.EN_INF_CRIT, AGENDA.CALC_CONS, AGENDA.LIQUIDACION, AGENDA.IMP_FACT, AGENDA.VENCIMIENTO, CICLOS.USUARIOS
FROM AGENDA, CICLOS
WHERE AGENDA.CICLO = CICLOS.CICLO 
AND                 (CICLOS.ESTADO = :ESTADO) 
OR                   (CICLOS.TM = :TM) 
OR                   (CICLOS.TIPO = :TIPO)
OR                   (CICLOS.CLASIFICACION = :CLASIF) 
OR                   (CICLOS.FORMATO = :FORMATO) 
OR                   (CICLOS.TOMA = :TOMA)
ORDER BY CICLOS.ORDEN

PD, para hacer los Join recuerde que debe ser entre claves primarias con valores unicos, sino el no va a saber que mostrarte.
 
Maeco, la ultima instruccion esta buena, el error es tuyo al no entender que ORDEN se refiere al conjunto de campos que componen el orden de la instruccion, osea el orden que tu desees.
Prueba esa y nos comentas
 
@johansan: Me gustaria saber por que dices que esta mala?
Si el query hecho, lo que esta haciendo es: Hacer una consulta interna de traer los datos necesarios, y el select externo solo toma todo lo que devolvio el select interno y ordenarlo.

Me parece mas que estas confundido en que el select externo mira las tablas del select interno, lo cual no es asi, eso ya lo hace el select interno.

PD: En si, la solucion es como dicen, hacer una subconsulta dentro de la principal. Sin embargo, realize un ejemplo con una base de datos donde trabajo, y la solucion que me funciono, fue colocar en el select el campo con el cual voy a ordenar, y funciono sin problema.

PD2: les dejo este link (http://www.java2s.com/Code/Oracle/CatalogOracle.htm), tiene referencia a los objetos de diversos lenguajes, muy util.
 
Código:
SELECT DISTINCT AGENDA.CICLO, AGENDA.PERIODO, AGENDA.GEN_LIBROS, AGENDA.IMP_LIBROS, AGENDA.TOMA_LECT, AGENDA.DIGIT_LECT, AGENDA.CRITICA, 
AGENDA.EN_INF_CRIT, AGENDA.CALC_CONS, AGENDA.LIQUIDACION, AGENDA.IMP_FACT, AGENDA.VENCIMIENTO, CICLOS.USUARIOS
FROM AGENDA, CICLOS
WHERE AGENDA.CICLO = CICLOS.CICLO 
AND                 (CICLOS.ESTADO = :ESTADO) 
OR                   (CICLOS.TM = :TM) 
OR                   (CICLOS.TIPO = :TIPO)
OR                   (CICLOS.CLASIFICACION = :CLASIF) 
OR                   (CICLOS.FORMATO = :FORMATO) 
OR                   (CICLOS.TOMA = :TOMA)
ORDER BY CICLOS.ORDEN

Error Message: ORA01791: no es una expresión obtenida bajo SELECT

PD, para hacer los Join recuerde que debe ser entre claves primarias con valores unicos, sino el no va a saber que mostrarte.

si , soy consciente de eso, los valores son unicos.

Maeco, la ultima instruccion esta buena, el error es tuyo al no entender que ORDEN se refiere al conjunto de campos que componen el orden de la instruccion, osea el orden que tu desees.

sip, despues cai en cuenta de eso.

Y como ya dije la solución es hacer consultas separadas esto es, si selecciona el checkbox ESTADO ejecutar la siguiente orden y deshabilitar los demas checkbox

PHP:
SELECT DISTINCT AGENDA.CICLO, AGENDA.PERIODO, AGENDA.GEN_LIBROS,  AGENDA.IMP_LIBROS, AGENDA.TOMA_LECT, AGENDA.DIGIT_LECT, AGENDA.CRITICA, 
AGENDA.EN_INF_CRIT, AGENDA.CALC_CONS, AGENDA.LIQUIDACION,  AGENDA.IMP_FACT, AGENDA.VENCIMIENTO, CICLOS.USUARIOS
FROM AGENDA, CICLOS
WHERE AGENDA.CICLO = CICLOS.CICLO 
AND                 (CICLOS.ESTADO = :ESTADO)  
ORDER BY CICLOS.ORDEN
si selecciona el checkbox TM ejecutar la siguiente orden y deshabilitar los demas

PHP:
SELECT DISTINCT AGENDA.CICLO, AGENDA.PERIODO, AGENDA.GEN_LIBROS,  AGENDA.IMP_LIBROS, AGENDA.TOMA_LECT, AGENDA.DIGIT_LECT, AGENDA.CRITICA, 
AGENDA.EN_INF_CRIT, AGENDA.CALC_CONS, AGENDA.LIQUIDACION,  AGENDA.IMP_FACT, AGENDA.VENCIMIENTO, CICLOS.USUARIOS
FROM AGENDA, CICLOS
WHERE AGENDA.CICLO = CICLOS.CICLO 
AND                 (CICLOS.TM = :TM) 
ORDER BY CICLOS.ORDEN
y asi sucesivamente y cuando deseleccione algun checkbox se habiliten....

no lo hago con AND por que es muy restrictivo, con OR se puede como ya coloque antes pero retorna demasiados repetidos, y si coloco parentesis sale un error de los que coloque antes y si se hacen de otras formas o haciendo subconsultas salen los errores ya mencionados....


otra pregunta como hago para pasar por codigo las columnas a seleccionar, pensé que era asi:

PHP:
SELECT :COLUMNA FROM AGENDA;
pero me retorna el nombre de columna, mas no el valor que realmente tiene, es decir :COLUMNA tiene asignado un TextBox, y ahi escribo por ejemplo CICLO, me devuelve:

CICLO
CICLO
CICLO
CICLO
CICLO
CICLO
CICLO
CICLO
....



muchas gracias a todos por su colaboración:)
 
otra pregunta como hago para pasar por codigo las columnas a seleccionar, pensé que era asi:

PHP:
SELECT :COLUMNA FROM AGENDA;
pero me retorna el nombre de columna, mas no el valor que realmente tiene, es decir :COLUMNA tiene asignado un TextBox, y ahi escribo por ejemplo CICLO, me devuelve:

CICLO
CICLO
CICLO
CICLO
CICLO
CICLO
CICLO
CICLO
....

muchas gracias a todos por su colaboración:)

Amigo, si usted quiere ejecutar una consulta "compuesta" por datos variables (asi como lo expone) lo que debe hacer es construir la consulta y meterla en una variable (char o varchar) y luego decirle al motor de base de datos (yo uso SQL Server) que ejecute lo que tiene esa variable, al mismo tiempo decirle que lo meta en una tabla temporal para que usted pueda consultar sus datos luego. Algo como:

Esto en código:
consulta="select "+variables_que_tienen_las_columnas+" from tabla order by campo_ordenacion"

Esto en motor SQL:
exec(consulta) into ##tabla_temporal

Esto en código:
select * from ##tabla_temporal

Si no la tiene clara se la explico con ejemplos, pero mas tarde, ahora ando full de camello.
 
Amigo, si usted quiere ejecutar una consulta "compuesta" por datos variables (asi como lo expone) lo que debe hacer es construir la consulta y meterla en una variable (char o varchar) y luego decirle al motor de base de datos (yo uso SQL Server) que ejecute lo que tiene esa variable, al mismo tiempo decirle que lo meta en una tabla temporal para que usted pueda consultar sus datos luego. Algo como:

Si no la tiene clara se la explico con ejemplos, pero mas tarde, ahora ando full de camello.

Si creo que le entendi, pero la grilla a veces se llena y otras no, y a veces deja algunas columnas que ya no necesito no se por que...

PHP:
string oradb = "Data Source=test;User ID=admin;Password=admin;Unicode=True";
OracleConnection conn = new OracleConnection(oradb);
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select " + txtcol.Text.ToString() + " from agenda";
      
 try
  {
   
   OracleDataReader dr = cmd.ExecuteReader();
   Grid1.DataSource = dr;
   Grid1.DataBind();
             
    }
   catch (OracleException ex)
    {
      throw new Exception ("Error al llenar la grilla " + ex.Message.ToString());

     }
me explico, si en txtcol digito ciclo y lanzo el codigo no muestra la grilla con los resultados toca darle actualizar a la pagina y ya los muestra, luego si en txtcol digito ciclo,periodo lo mismo o solamente me muestra una de las dos columnas, y si mas adelante le digito periodo, gen_libros, usuarios toca actualizar y ademas de eso me muestra columnas de anteriores consultas en este caso ciclo y periodo:\
 
A ese Textbox no necesita ponerle el .ToString();, por defecto lo lee como tal ;) ....


Otra cosa es, porque no mejor usar un combobox con los ciclos y de ahi solo convierte el seleccionado a string?? :rolleyes:

SuerteX :)
 
Otra cosa es, porque no mejor usar un combobox con los ciclos y de ahi solo convierte el seleccionado a string?? :rolleyes:

es una idea, pero no se que columnas el usuario quiere, algunas veces necesita solo ciclo y toma_lect, otras veces solo ciclo, imp_libros y usuarios, y no es que siempre necesite ciclo, puede tambien ser toma_lect,periodo y usuarios, van ha haber demasiadas combinaciones, entonces la idea es utilizar checkbox por cada columna y asignar por codigo la consulta de acuerdo a los checkbox que el usuario haya seleccionado.

algo asi:
PHP:
 protected void Button2_Click(object sender, EventArgs e)
        {
            string consulta = "";
            string c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13;
            Grid1.ClearPreviousDataSource();

            if (CheckBox1.Checked == true) c1 = "ciclo";
            if (CheckBox2.Checked == true) c2 = "periodo";
            if (CheckBox3.Checked == true) c3 = "gen_libros";
            if (CheckBox4.Checked == true) c4 = "imp_libros";
            if (CheckBox5.Checked == true) c5 = "toma_lect";
            if (CheckBox6.Checked == true) c6 = "digit_lect";
            if (CheckBox7.Checked == true) c7 = "critica";
            if (CheckBox8.Checked == true) c8 = "en_inf crit";
            if (CheckBox9.Checked == true) c9 = "calc_cons";
            if (CheckBox10.Checked == true) c10 = "liquidacion";
            if (CheckBox11.Checked == true) c11 = "imp_fact";
            if (CheckBox12.Checked == true) c12 = "vencimiento";
            if (CheckBox13.Checked == true) c13 = "usuarios";

            if (c1.Length > 0) consulta = consulta+","+ c1;
            if (c2.Length > 0) consulta = consulta + "," + c2;
            if (c3.Length > 0) consulta = consulta + "," + c3;
            if (c4.Length > 0) consulta = consulta + "," + c4;
            if (c5.Length > 0) consulta = consulta + "," + c5;
            if (c6.Length > 0) consulta = consulta + "," + c6;
            if (c7.Length > 0) consulta = consulta + "," + c7;
            if (c8.Length > 0) consulta = consulta + "," + c8;
            if (c9.Length > 0) consulta = consulta + "," + c9;
            if (c10.Length > 0) consulta = consulta + "," + c10;
            if (c11.Length > 0) consulta = consulta + "," + c11;
            if (c12.Length > 0) consulta = consulta + "," + c12;
            if (c13.Length > 0) consulta = consulta + "," + c13;


            consulta = consulta.Substring(1, consulta.Length-1);
            consulta = "select " + consulta + " from agenda";   

            string oradb = "Data Source=test;User ID=admin;Password=admin;Unicode=True";
            OracleConnection conn = new OracleConnection(oradb);
            conn.Open();
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;

            cmd.CommandText = consulta;
            
            try
            {
              OracleDataReader dr = cmd.ExecuteReader();
              Grid1.DataSource = dr;    
              Grid1.DataBind();
              
            }
            catch (OracleException ex)
            {
                throw new Exception ("Error al llenar la grilla " + ex.Message.ToString());

            }
            txtcol.Text = "";
            Grid1.Dispose();      
          
           
            
            
           
        }
 
es una idea, pero no se que columnas el usuario quiere, algunas veces necesita solo ciclo y toma_lect, otras veces solo ciclo, imp_libros y usuarios, y no es que siempre necesite ciclo, puede tambien ser toma_lect,periodo y usuarios, van ha haber demasiadas combinaciones, entonces la idea es utilizar checkbox por cada columna y asignar por codigo la consulta de acuerdo a los checkbox que el usuario haya seleccionado.

algo asi:
PHP:
 protected void Button2_Click(object sender, EventArgs e)
        {
            string consulta = "";
            string c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13;
            Grid1.ClearPreviousDataSource();

            if (CheckBox1.Checked == true) c1 = "ciclo";
            if (CheckBox2.Checked == true) c2 = "periodo";
            if (CheckBox3.Checked == true) c3 = "gen_libros";
            if (CheckBox4.Checked == true) c4 = "imp_libros";
            if (CheckBox5.Checked == true) c5 = "toma_lect";
            if (CheckBox6.Checked == true) c6 = "digit_lect";
            if (CheckBox7.Checked == true) c7 = "critica";
            if (CheckBox8.Checked == true) c8 = "en_inf crit";
            if (CheckBox9.Checked == true) c9 = "calc_cons";
            if (CheckBox10.Checked == true) c10 = "liquidacion";
            if (CheckBox11.Checked == true) c11 = "imp_fact";
            if (CheckBox12.Checked == true) c12 = "vencimiento";
            if (CheckBox13.Checked == true) c13 = "usuarios";

            if (c1.Length > 0) consulta = consulta+","+ c1;
            if (c2.Length > 0) consulta = consulta + "," + c2;
            if (c3.Length > 0) consulta = consulta + "," + c3;
            if (c4.Length > 0) consulta = consulta + "," + c4;
            if (c5.Length > 0) consulta = consulta + "," + c5;
            if (c6.Length > 0) consulta = consulta + "," + c6;
            if (c7.Length > 0) consulta = consulta + "," + c7;
            if (c8.Length > 0) consulta = consulta + "," + c8;
            if (c9.Length > 0) consulta = consulta + "," + c9;
            if (c10.Length > 0) consulta = consulta + "," + c10;
            if (c11.Length > 0) consulta = consulta + "," + c11;
            if (c12.Length > 0) consulta = consulta + "," + c12;
            if (c13.Length > 0) consulta = consulta + "," + c13;

            consulta = consulta.Substring(1, consulta.Length-1);
            consulta = "select " + consulta + " from agenda";   

            string oradb = "Data Source=test;User ID=admin;Password=admin;Unicode=True";
            OracleConnection conn = new OracleConnection(oradb);
            conn.Open();
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            cmd.CommandText = consulta;
            
            try
            {
              OracleDataReader dr = cmd.ExecuteReader();
              Grid1.DataSource = dr;    
              Grid1.DataBind();              
            }
            catch (OracleException ex)
            {
                throw new Exception ("Error al llenar la grilla " + ex.Message.ToString());
            }
            txtcol.Text = "";
            Grid1.Dispose();
}

Una vez tuve la misma duda y pense en ponerlo todo en un Store Procedure, ademas ya debe conocer los riesgos e implicaciones al poner una consulta en la aplicacion.


Yo te recomendaria crearas una clase con los campos de esa tabla (o las tablas involucrada en dicha consulta) y en el PA recorras los campos de la consulta y lo concatenes alli (concatener en .net es una tarea que consume recurso, mejor usa stringbuilder ;)), asi en caso de tener que modificar algo solo tendrias que modificar los campos en la base de datos ;).

Otra punto es, si quieres hacerlo como lo estas haciendo te recomiendo que utilices forecach, asi solo utilizarias un foreach y un if como maximo y concatenas con stringbuilder ;).

SuerteX :)
 
hola amigos les quisiera pedir su ayuda soy nuevo en la programacion e intento crear la coneccion de netbean 6.8 con el oracle 10g pero no e podido pongo asi:

package conexion;
import java.sql.*;
public class Main {
public static void main(String[] args) {
try{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conexion= DriverManager.getConnection("jdbc:eek:racle:thin:mad:localhost:1521:XE","scott","tiger");
System.out.println("Conexion Hecha");
}
catch(SQLException error){
System.out.println("Existe un error: "+error);
}
}
}
pero me saca error
que es el siguiente:
Existe un error: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:
localhost:1521:XE
agradesco su ayuda en realidad es urgente
 
T_T me podrian explicar mejor la verdad no entendi es que estoy en problemado con eso agradesco su ayuda gracias
 
entre a [noparse]C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN[/noparse]

y en el archivo tnsnames.ora, verfique si esta creada la cadena de conexion XE
 
mira amigo esto es lo que se encuentra en el tnsnames.ora
# tnsnames.ora Network Configuration File: G:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = pc)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

que tengo que hacer para arreglar la conneccion
 
efectivamente te falta la cadena de conexion XE, que seria mas o menos asi:

PHP:
XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = *)(PORT = **))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
* aqui va el nombre de tu equipo o el equipo que va ha servir de host
**
aqui va el numero del puerto, generalmente es 1521