Estoy tratando de implementar un generador de consultas automático, y mi enfoque para un tipo de consultas es tener uniones anidadas de tal manera Seleccionar * De ((Q1 unirse a Q2 en Q1.x = Q2.x) Como T1 Unir Q3 en T1. x = Q3) Como T2) Únete a Q4 en T2.x = Q4.x) Como T3 ... y así sucesivamente

Traté de implementarlo de tal manera, pero la sintaxis parece estar equivocada

SELECT
  *
FROM
  (
    (
      SELECT
        *
      FROM
        (
          Select
            *
          From
            Customers
        ) AS q11
        INNER JOIN (
          Select
            *
          From
            Customers
        ) AS q12 ON q11.customerID = q12.customerID
    )
  ) q1
  JOIN (
    Select
      *
    from
      Customers
  ) q2 ON q1.q11.CustomerID = q2.CustomerID
0
Ismail K. Wahdan 9 may. 2019 a las 21:05

3 respuestas

La mejor respuesta

Una versión un poco más compacta sería:

;WITH Data AS(Select * From Customers)

SELECT 
    * 
FROM
    Data D1
    INNER JOIN Data D2 ON D2.ID=D1.ID
    INNER JOIN Data D3 ON D3.ID=D2.ID
    INNER JOIN Data D4 ON D4.ID=D3.ID
    INNER JOIN Data D5 ON D5.ID=D4.ID
    INNER JOIN Data D6 ON D6.ID=D5.ID
    INNER JOIN Data D7 ON D7.ID=D6.ID

Y aún más compacta:

SELECT * FROM D D1
JOIN D D2 ON D2.ID=D1.ID
JOIN D D3 ON D3.ID=D2.ID
JOIN D D4 ON D4.ID=D3.ID
JOIN D D5 ON D5.ID=D4.ID
JOIN D D6 ON D6.ID=D5.ID
JOIN D D7 ON D7.ID=D6.ID
2
Ross Bush 9 may. 2019 a las 18:24

Una consulta en la cláusula from es adecuada para crear tablas.

Select * from (select * from (select * from (select * from q1, q2 where q1.x = q2.x) t1, q3 where t1.x = q3.x) t2, q4 where t2.x = q4.x ) t3, q5 donde t3.x = q5.x

0
Rachit 9 may. 2019 a las 19:04

Seleccionar declaraciones y subconsultas no devuelven columnas con puntos.

Entonces q1.q11.CustomerID no tiene sentido.

Un SQL JOIN calcula una unión cruzada. Ese valor primero tiene una columna por columna de la tabla izquierda, con los nombres de las columnas de la tabla izquierda; entonces ese valor tiene una columna por columna de la tabla derecha, con los nombres de las columnas de la tabla derecha. Las columnas están identificadas por nombres de columna con puntos, también conocidos como referencias de columna, pero sus nombres no tienen puntos. A SELECT * devuelve todas esas columnas, por lo que devuelve nombres duplicados cuando las tablas de entrada comparten nombres. Pero no puntos en los nombres.

2
philipxy 10 may. 2019 a las 04:38