sql - español - powerapps ejemplos
El identificador de varias partes no se puede vincular (13)
He visto errores similares en SO, pero no encuentro una solución para mi problema. Tengo una consulta SQL como:
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a ,
quanhuyen b
LEFT OUTER JOIN ( SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN ''Sep 1 2011''
AND
''Sep 5 2011''
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> ''99''
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
Cuando ejecuto esta consulta, el resultado del error es: El identificador de varias partes "a.maxa" no se pudo enlazar. ¿Por qué?
P / s: si divido la consulta en 2 consultas individuales, se ejecuta bien.
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen
FROM phuongxa a ,
quanhuyen b
WHERE a.maxa <> ''99''
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
y
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN ''Sep 1 2011''
AND ''Sep 5 2011''
GROUP BY maxa;
¿Olvidaste unir algunas tablas? Si no, entonces probablemente necesite usar algunos alias.
Algunas veces este error ocurre cuando usa su esquema (dbo) en su consulta de una manera incorrecta.
por ejemplo, si escribes:
select dbo.prd.name
from dbo.product prd
obtendrás el error.
En estas situaciones, cámbialo a:
select prd.name
from dbo.product prd
En cambio, puedes intentar unir mesas como,
select
....
from
dkcd
right join
a
, b
Esto debería funcionar
En mi caso, el problema resultó ser el nombre de alias que le había dado a la mesa. "oa" parece no ser aceptable para SQL Server.
Está mezclando combinaciones implícitas con combinaciones explícitas. Eso está permitido, pero debe ser consciente de cómo hacerlo correctamente.
El hecho es que las combinaciones explícitas (las que se implementan usando la palabra clave JOIN
) tienen prioridad sobre las implícitas (las uniones ''coma'', donde la condición de unión se especifica en la cláusula WHERE
).
Aquí hay un resumen de su consulta:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
Probablemente esperas que se comporte así:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
es decir, la combinación de las tablas a
y b
se une a la tabla dkcd
. De hecho, lo que está sucediendo es
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
es decir, como ya habrá comprendido, dkcd
se une específicamente contra b
solo b
, luego el resultado de la combinación se combina con a
y se filtra más con la cláusula WHERE
. En este caso, cualquier referencia a a
en la cláusula ON
es inválida, a
se desconoce en ese punto. Es por eso que recibes el mensaje de error.
Si yo fuera usted, probablemente intente reescribir esta consulta, y una posible solución podría ser:
SELECT DISTINCT
a.maxa,
b.mahuyen,
a.tenxa,
b.tenhuyen,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
LEFT OUTER JOIN (
SELECT
maxa,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(datetime, ngaylap, 103) BETWEEN ''Sep 1 2011'' AND ''Sep 5 2011''
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> ''99''
ORDER BY a.maxa
Aquí las tablas a
y b
se unen primero, luego el resultado se une a dkcd
. Básicamente, esta es la misma consulta que la suya, solo que usa una sintaxis diferente para una de las combinaciones, lo que hace una gran diferencia: la referencia a.maxa
en la dkcd
de unión de dkcd
ahora es absolutamente válida.
Como @Aaron Bertrand ha señalado correctamente, probablemente debería calificar a maxa
con un alias específico, probablemente a
, en la cláusula ORDER BY
.
Estaba luchando con el mismo mensaje de error en SQL Server, ya que tenía varias combinaciones, cambiando el orden de las uniones lo resolvió para mí.
Estaba teniendo el mismo error de JDBC. Comprobé todo y mi consulta estuvo bien. Resultó, en donde cláusula tengo una discusión:
where s.some_column = ?
Y el valor del argumento que estaba pasando era nulo. Esto también da el mismo error que es engañoso porque cuando buscas en Internet terminas diciendo que algo anda mal con la estructura de la consulta, pero no está en mi caso. Solo pensé que alguien podría enfrentar el mismo problema
Mi error fue usar un campo que no existía en la tabla.
table1.field1 => no existe
table2.field1 => es correcto
Corrija su nombre de tabla.
mi error ocurrió por usar CON
WITH RCTE AS (
SELECT...
)
SELECT RCTE.Name, ...
FROM
RCTE INNER JOIN Customer
ON RCTE.CustomerID = Customer.ID
cuando se utiliza en unirse a otras tablas ...
Si este error ocurre en una UPDATE
, vuelva a verificar JOIN
en la tabla con la columna / campo que está causando el error.
En mi caso esto se debió a la falta de JOIN
, que generó el mismo error debido a un campo desconocido (como señaló Andriy ).
Si ninguno de los anteriores está funcionando, intente copiar los resultados conocidos que cumplan con uno de los criterios de búsqueda a una tabla temporal, y luego hacer la combinación en eso.
Soy nuevo en SQL, pero me encontré con este problema en un curso que estaba tomando y descubrí que la asignación de la consulta al proyecto ayudó específicamente a eliminar el error de varias partes. Por ejemplo, el proyecto que creé era CTU SQL Project, así que me aseguré de iniciar mi script con USE [CTU SQL Project] como mi primera línea, como a continuación.
USE [CTU SQL Project]
SELECT Advisors.First_Name, Advisors.Last_Name...and so on.
si has dado un nombre cambia eso a nombre real
por ejemplo
SELECT
A.name,A.date
FROM [LoginInfo].[dbo].[TableA] as A
join
[LoginInfo].[dbo].[TableA] as B
on [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name;
cambiar eso a
SELECT
A.name,A.date
FROM [LoginInfo].[dbo].[TableA] as A
join
[LoginInfo].[dbo].[TableA] as B
on A.name=B.name;
SELECT DISTINCT
phuongxa.maxa ,
quanhuyen.mahuyen ,
phuongxa.tenxa ,
quanhuyen.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa ,
quanhuyen
LEFT OUTER JOIN ( SELECT khaosat.maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN ''Sep 1 2011''
AND
''Sep 5 2011''
GROUP BY khaosat.maxa
) AS dkcd ON dkcd.maxa = maxa
WHERE phuongxa.maxa <> ''99''
AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen
ORDER BY maxa;