MySQL, когда использовать JOIN и когда не дублировать]

Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.

например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.

public Class myClass
{
   public int prop1 {get;set;}
}

Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref.prop1 = 1;  //This line throws error
     }
}

выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.

Чтобы исправить это, вам нужно создать экземпляр (присвоить объект ссылке на этот класс).

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref = new myClass();
        ref.prop1 = 1;  
     }
}
33
задан halfdan 13 April 2011 в 20:11
поделиться

4 ответа

Нет никакой разницы в производительности.

Однако первый стиль - ANSI-89, и ваши ноги сломаны в некоторых магазинах. Включая мой. Второй стиль - ANSI-92 и намного понятнее.

Примеры:

Что такое JOIN, который является фильтром?

FROM T1,T2,T3....
WHERE T1.ID = T2.ID AND
     T1.foo = 'bar' AND T2.fish = 42 AND
     T1.ID = T3.ID

FROM T1 
   INNER JOIN T2 ON T1.ID = T2.ID
   INNER JOIN T3 ON T1.ID = T3.ID
WHERE
   T1.foo = 'bar' AND T2.fish = 42

Если вы имеют ВЗАИМОДЕЙСТВИЕ (=*, *=), тогда второй стиль будет работать так, как рекламируется. Первый, скорее всего, не будет и также устарел в SQL Server 2005 +

. Стиль ANSI-92 также сложнее для bollix. В более старом стиле вы можете легко получить декартово произведение (перекрестное соединение), если вы пропустите условие. Вы получите синтаксическую ошибку с ANSI-92.

Редактирование: некоторые дополнительные пояснения

  • Причиной не использовать «join the where» (неявный) является хитроумный результат с внешними объединениями.
  • Если вы используете явные OUTER JOINs + implicit INNER JOINs, вы все равно получите изворотливые результаты + у вас есть несогласованность в использовании

Это не просто синтаксис : это о имеющий семантически правильный запрос

Редактировать, декабрь 2011

Порядок обработки логических запросов SQL Server - FROM, ON, JOIN, WHERE ...

Итак, если вы смешиваете «неявные внутренние соединения WHERE» и «явные внешние внешние соединения», вы, скорее всего, не получите ожидаемых результатов, потому что запрос неоднозначен ...

43
ответ дан gbn 4 September 2018 в 08:02
поделиться

Это дубликат этого вопроса SO: Явное vs неявное соединение SQL . Вообще я думаю, что неявная (где версия) плохая форма и не такая ясная, как явная (в версии). Я также думаю, что имплицитный амортизируется, но не 100% на него. План выполнения одинаковый для обоих.

0
ответ дан Community 4 September 2018 в 08:02
поделиться

Я презираю, когда вы принудительно присоединяете, используя WHERE. Мне просто не нравится, грязный хак. Правильное соединение ANSI - использовать ON:

SELECT 
    p.Product,
    o.Order
FROM 
    Product p
INNER JOIN
    Order o
ON
    o.OrderID = p.OrderID

Предпочтительно использовать ON при подключении и WHERE для фильтрации результатов. Помните, что ГДЕ - одна из последних вещей, которые вы будете использовать, помимо группировки и порядка, где вы хотите отфильтровать результаты. Таким образом, вы не должны присоединяться к своим таблицам с помощью WHERE, поскольку его трудно прочитать.

SELECT 
    p.Product,
    o.Order
FROM 
    Product p
INNER JOIN
    Order o
ON
    o.OrderID = p.OrderID
WHERE
    o.Category = 'IT'

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

Когда я вижу, что разработчики используют WHERE для объединения своих таблиц, это обычно указывает на то, что они не знают достаточно T-SQL. Это мое личное мнение.

2
ответ дан JonH 4 September 2018 в 08:02
поделиться

Разница - читаемость и ремонтопригодность. SELECT * FROM a JOIN b ON a.ID = b.ID передает ваше точное намерение, все в одном месте.

Я не буду говорить окончательно, так как я не получил под капотом последнего оптимизатора запросов, но я уверен, смотря на тривиальную разницу в производительности, если таковая имеется.

4
ответ дан marc_s 4 September 2018 в 08:02
поделиться
Другие вопросы по тегам:

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