Нельзя привязывать таблицу при использовании левого соединения [дубликат]

Для тех, кто борется с этим, попробовав вышеуказанные решения, убедитесь, что идентификатор канала, используемый при создании канала уведомлений, идентичен идентификатору канала, установленному в конструкторе уведомлений.

const val CHANNEL_ID = "EXAMPLE_CHANNEL_ID"

// create notification channel
val notificationChannel = NotificationChannel(CHANNEL_ID, 
NOTIFICATION_NAME, NotificationManager.IMPORTANCE_HIGH)

// building notification
NotificationCompat.Builder(context)
                    .setSmallIcon(android.R.drawable.ic_input_add)
                    .setContentTitle("Title")
                    .setContentText("Subtitle")   
                    .setPriority(NotificationCompat.PRIORITY_MAX)
                    .setChannelId(CHANNEL_ID)
152
задан Tim Coker 15 January 2016 в 16:13
поделиться

13 ответов

Вы смешиваете неявные соединения с явным соединением. Это допустимо, но вам нужно знать, как это сделать должным образом.

Дело в том, что явные объединения (те, которые реализованы с использованием ключевого слова JOIN) имеют приоритет над неявными ( «comma» присоединяется, где условие соединения указано в предложении WHERE).

Вот схема вашего запроса:

SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

Вероятно, вы ожидаете, что он будет вести себя например:

SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

, то есть комбинация таблиц a и b соединена с таблицей dkcd. Фактически, что происходит

SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

, то есть, как вы уже поняли, dkcd соединен конкретно с b и только b, тогда результат объединения объединяется с a и далее фильтруется с предложением WHERE. В этом случае любая ссылка на a в предложении ON недействительна, a неизвестно в этой точке. Вот почему вы получаете сообщение об ошибке.

Если бы я был вами, я бы, вероятно, попытался переписать этот запрос, и одним из возможных решений могло бы быть:

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

таблицы a и b соединяются сначала, тогда результат соединяется с dkcd. В основном, это тот же запрос, что и ваш, только с использованием другого синтаксиса для одного из соединений, что имеет большое значение: ссылка a.maxa в состоянии соединения dkcd теперь абсолютно верна.

Как правильно отметил @Aaron Bertrand, вы должны, вероятно, квалифицировать maxa с определенным псевдонимом, вероятно a, в предложении ORDER BY.

172
ответ дан Andriy M 3 September 2018 в 17:55
поделиться

Я новичок в SQL, но столкнулся с этой проблемой в ходе курса, который я принимал, и обнаружил, что назначение запроса проекту специально помогло устранить многочастную ошибку. Например, проект, который я создал, был CTU SQL Project, поэтому я убедился, что начал свой сценарий с USE [CTU SQL Project] в качестве первой строки, как показано ниже.

USE [CTU SQL Project]
SELECT Advisors.First_Name, Advisors.Last_Name...and so on.
1
ответ дан Bogartz 3 September 2018 в 17:55
поделиться

Иногда эта ошибка возникает, когда вы неправильно используете свою схему (dbo) в своем запросе.

, например, если вы пишете:

select dbo.prd.name
from dbo.product prd

, вы получите ошибка.

В таких ситуациях измените его на:

select prd.name
from dbo.product prd
31
ответ дан breceivemail 3 September 2018 в 17:55
поделиться

Если эта ошибка произошла в UPDATE, дважды проверьте JOIN в таблице со столбцом / полем, вызывающим ошибку.

В моем случае это было связано с отсутствием самого JOIN, который породил ту же ошибку из-за неизвестного поля (как Андрей указал ).

7
ответ дан Community 3 September 2018 в 17:55
поделиться

В моем случае проблема оказалась псевдонимом, которое я дал таблице. «oa», по-видимому, неприемлемо для SQL Server.

1
ответ дан Hashim Akhtar 3 September 2018 в 17:55
поделиться

Вы забыли присоединиться к некоторым столам? Если нет, вам, вероятно, придется использовать некоторые псевдонимы.

1
ответ дан JedatKinports 3 September 2018 в 17:55
поделиться

Если ни одно из вышеперечисленных действий не работает, попробуйте скопировать известные результаты, которые соответствуют одному из критериев поиска во временную таблицу, а затем выполните соединение на этом.

0
ответ дан JosephDoggie 3 September 2018 в 17:55
поделиться

Я боролся с тем же сообщением об ошибке в SQL SERVER, так как у меня было несколько объединений, изменение порядка соединений было решено для меня.

6
ответ дан Pavel M. 3 September 2018 в 17:55
поделиться

Вместо этого вы можете попробовать подключиться к таблицам, например,

select 
  .... 
from 
   dkcd 
     right join 
                a
                  , b

Это должно работать

1
ответ дан slfan 3 September 2018 в 17:55
поделиться
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;
1
ответ дан SVaidya 3 September 2018 в 17:55
поделиться

Я также боролся с этой ошибкой и оказался в той же стратегии, что и ответ. Я включаю свой ответ, чтобы подтвердить, что это стратегия, которая должна работать.

Вот пример, когда я делаю сначала одно внутреннее соединение между двумя таблицами, которые, как я знаю, получил данные, а затем два левых внешних соединения на таблицах, которые могут иметь соответствующие строки, которые могут быть пустыми. Вы смешиваете внутренние соединения и внешние соединения, чтобы получать результаты с данными по таблицам вместо того, чтобы делать синтаксис по умолчанию, разделенный запятой между таблицами, и пропускать строки в желаемом соединении.

use somedatabase
go 

select o.operationid, o.operatingdate, p.pasid, p.name as patientname, o.operationalunitid, f.name as operasjonsprogram,  o.theaterid as stueid, t.name as stuenavn, o.status as operasjonsstatus from operation o 
inner join patient p on o.operationid = p.operationid 
left outer join freshorganizationalunit f on f.freshorganizationalunitid = o.operationalunitid
left outer join theater t on t.theaterid = o.theaterid
where (p.Name like '%Male[0-9]%' or p.Name like '%KFemale [0-9]%')

Сначала: Внутренние соединения между таблицами, которые, как вы ожидаете, будут соответствовать данным. Вторая часть. Продолжайте использовать внешние соединения, чтобы попытаться получить данные в других таблицах, но это не будет отфильтровывать ваш результирующий набор, если внешнее соединение таблицы не имеет соответствующих данных или соответствует условию, которое вы настроили в предикате / состоянии.

0
ответ дан Tore Aurstad 3 September 2018 в 17:55
поделиться

Я получал ту же ошибку от JDBC. Проверено все, и мой запрос был в порядке. Оказалось, в where where у меня есть аргумент:

where s.some_column = ?

И значение аргумента, в котором я проходил, было null. Это также дает ту же ошибку, которая вводит в заблуждение, потому что при поиске в Интернете вы оказываетесь в том, что что-то не так с структурой запроса, но это не в моем случае. Просто подумал, что кто-то может столкнуться с тем же вопросом

0
ответ дан xbmono 3 September 2018 в 17:55
поделиться

Моя ошибка состояла в том, чтобы использовать поле, которое не было в таблице.

table1.field1 => не существует

table2.field1 => правильно

Исправить имя таблицы.

моя ошибка произошла из-за использования WITH

WITH RCTE AS (
   SELECT...
)
SELECT RCTE.Name, ...
FROM 
  RCTE INNER JOIN Customer
  ON RCTE.CustomerID = Customer.ID 

при использовании в соединении с другими таблицами ...

1
ответ дан Zolfaghari 3 September 2018 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: