Select left join: Оператор SQL LEFT JOIN: синтаксис, примеры

sql — LEFT JOIN (SELECT) Синтаксическая ошибка в пункте

спросил

Изменено
9 лет, 11 месяцев назад

Просмотрено
9к раз

Кто-нибудь может указать мне на ошибку в этом операторе sql?

 SELECT CommTypes.Description, Intro.[Percent]
ОТ CommTypes
ЛЕВОЕ СОЕДИНЕНИЕ
(
    ВЫБИРАТЬ *
    ОТ IntroducerBasis
    ГДЕ IntroducerBasis.IntroducerCode='AG'
       И IntroducerBasis.BasisNumber=1
) КАК Введение
ON CommTypes.ID = Intro.CommTypeID;
 

Ошибка указывает на последующую инструкцию SELECT как на источник ошибки.

Ошибка «Синтаксическая ошибка в пункте From»

  • sql
  • ms-access

9

Ну, раз вы возвращаете значение только из родительской таблицы, зачем вам вообще нужен подзапрос?

Однако попробуйте указать столбцы, а не * в подзапросе:

 SELECT CommTypes. Description
ОТ CommTypes
ЛЕВОЕ СОЕДИНЕНИЕ (
    ВЫБИРАТЬ
    поле1,
    поле2
    ОТ IntroducerBasis
    ГДЕ IntroducerCode='AG' AND BasisNumber=1) AS Intro
ON CommTypes.ID = Intro.CommTypeID;
 

4

 SELECT CommTypes.[Описание], Intro.[Percent]
ОТ CommTypes
ЛЕВОЕ СОЕДИНЕНИЕ
(
    ВЫБИРАТЬ *
    ОТ IntroducerBasis
    ГДЕ IntroducerBasis.IntroducerCode='AG'
       И IntroducerBasis.BasisNumber=1
) КАК Введение
ON CommTypes.ID = Intro.CommTypeID
 

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

2

Я не уверен, разрешен ли такой тип присоединения к оператору select в MS-ACCESS.
Попробуйте вместо этого:

 SELECT CommTypes.Description, IntroducerBasis.Percent
ОТ CommTypes
LEFT JOIN
   ON CommTypes.ID = IntroducerBasis.CommTypeID
   И IntroducerBasis. IntroducerCode='AG'
   И IntroducerBasis.BasisNumber=1;
 

2

Это похоже на ограничение доступа, так как создание подзапроса в доступе и присоединение к нему работает отлично.

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

sql server — SQL: левое соединение, но выберите только одну строку с наименьшей датой создания

Задавать вопрос

спросил

Изменено
1 год, 6 месяцев назад

Просмотрено
8к раз

Допустим, у меня есть эта таблица:

Таблица A:

 идентификатор имя
--- ---
 1 Джон
 

Таблица B:

 id содержание Помощь Дата
  --- --- --- ----------
  100 абв 1 2017-02-03 11:16:00
  101 хиз 1 03.02.2017 11:50:00
 

Я хочу соединить A и B так, чтобы результирующая таблица содержала только одну строку из B с датой = минимум.

Мой желаемый вывод:

 id name content
--- --- ------
 1 Иоанна азбука
 

Моя неудачная попытка присоединения также дает мне строку (1, John, xyz):

 SELECT A. [id], A.[name], B.[content]
ИЗ
ЛЕВОЕ СОЕДИНЕНИЕ B
ON A.id = B.Aid
 

Позже я попытался выполнить внутреннее соединение WHERE, но не смог его создать:

 SELECT A.[id], A.[name]
ИЗ
ЛЕВОЕ СОЕДИНЕНИЕ B
ON A.id = (SELECT Aid FROM B WHERE Date = (SELECT MIN(Date) FROM B
ГДЕ <не знаю, куда я иду?>)
 

Может ли кто-нибудь указать мне правильное направление?

  • sql
  • sql-server
  • tsql
  • присоединиться к
  • наибольший-n-на-группу

1

 ВЫБЕРИТЕ A.[id], A.[имя],B.[содержимое]
ИЗ
ЛЕВОЕ СОЕДИНЕНИЕ B
ON A.id = B.Aid
И B.Date = (Выберите Min(Date) из B как B2, где B2.Aid=A.id)
 

1

Вы можете использовать левое соединение с производной таблицей:

 SELECT a.ID, a.Name, b.Content
Из
ЛЕВОЕ СОЕДИНЕНИЕ
(
    SELECT aId, content, ROW_NUMBER() OVER (PARTITION BY aId ORDER BY Date) rn
    ИЗ б
) b ON(a.Id = b.AId И b.rn = 1)
 

Оконная функция row_number будет начинаться с 1 для каждого и с минимальной датой, поэтому вам нужно добавить условие AND b.