JOIN - Обединете нормализираните таблици отново за заявка

Предварителна забележка

синтаксис

  • Версия със запетая:
  • Най-проста форма на ВЪТРЕШНОТО ПРИСЪЕДИНЯВАНЕ
  • Множество връзки:
  • Вместо INNER може да се използва и една от следните ключови думи:
  • ИЛИ може да се използва вместо оператора И, могат да се посочат повече от два израза за сравнение и И и ИЛИ да се комбинират.
  • Таблица може да бъде посочена и два пъти, като се говори за една Самосвързващи се, тъй като редовете в таблицата са свързани с други редове в таблицата. Освен версията със запетая, за таблица е необходимо поне едно име на псевдоним, за да се опишат ясно колоните.

Примери

  1. Тази версия със запетая комбинира всеки ред от таблицата ARTIKEL с всеки ред от таблицата SALES и извежда резултата от 4 * 9 = 36 реда изцяло. Ако сравните двете колони A.A_NR и U.A_NR, ще забележите, че на продажбите в повечето случаи се присвояват артикули, които са различни от статията, спомената в продажбите. Тези (36 - 9) = 27 резултата са безсмислени. Условието на филтъра, посочено в клаузата ON в следващата клауза JOIN, премахва тези записи на данни.
  2. Това е най-простата и често използвана форма на JOIN. Колоната A. A_NR също е първичният ключ на таблицата ARTIKEL; може да има няколко поръчки за статия, т.е. редове в таблицата ПРОДАЖБИ. Всички редове, в които двете колони A.A_NR и U.A_NR не съвпадат, се премахват от версията със запетая, дадена по-горе.

Тази заявка първо съвпада с всички онези редове помежду си, които се отнасят до една и съща дата и една и съща статия. Тъй като третото условие е да проверите дали колоната A_STUECK е различна, първо се премахват всички комбинации от дата и статия, които се отнасят до един и същ ред. Същото нещо обаче би изпълнило теста U1.UMSATZ_NR <> U1.UMSATZ_NR. Тестът, който всъщност е използван, обаче допълнително премахва всички комбинации от дата и артикул, за които артикулът е продаван няколко пъти със същия брой парчета; извеждат се само тези комбинации, при които артикулът е бил продаден в поне два различни броя парчета за един ден. Тъй като всяка комбинация от редове, които отговарят на тези условия, се изпълнява и ако двата реда се разменят, условието <> може да бъде заменено и с U2.Value_No, така че само елемент 11 е издаден на 25.06.1999 г., който е бил продаден два пъти двадесет пъти. Всичко на всичко:

комбинирайте

Забележки

  1. Ако свързвате таблици, обикновено трябва да използвате един от методите JOIN. По-специално трябва да се избягва „старата“ техника, която използва скобената версия и премества клаузата ON в условието WHERE. Сравнете двете следните представления: с В първата версия, която не може да се използва, условието за свързване на двете таблици се смесва с условието, което избира няколко реда. Втората версия обаче разделя свързването на таблиците от намаляването на колоните. Като правило всички WHERE условия, които намаляват броя на редовете, се изпълняват първо; JOIN се създава само с помощта на останалия брой редове.
  2. ЛЕВОТО и ДЯСНОТО съединение са симетрични помежду си. Следователно следните две изявления за определяне на никога продадените артикули трябва да генерират една и съща блок-схема (добавете елемент, който никога не се продава, както по-горе): и OUTER JOIN комбинира НАЛЯВО/НАДЯСНО и приема както съвпадащи редове, така и нулеви стойности от двете таблици.
  3. Конструкциите за ляво или дясно присъединяване са задължителни, ако таблица съдържа връзка към незадължителна гранична таблица. Класически пример присвоява заглавия на лица, заглавията (Dr., Dr.med, Prof.Dr.) се съхраняват в таблица на полета, таблицата на хората съдържа колона с идентификатора на таблицата със заглавия. Ако има хора без заглавие, в таблицата на полетата може да се създаде запис без текст и за свързване може да се използва ВЪТРЕШНО ПРИСЪЕДИНЯВАНЕ или такъв запис липсва. Това означава, че съответната клетка в таблицата на лицата е празна, така че ляво/дясно съединение трябва да се формира от основната таблица до таблицата на ръба, ако трябва да бъдат намерени всички лица.

Пример за MS-SqlServer: CoalEsce връща първия израз в списъка, който е различен от нула. Ако заглавие съществува, то ще бъде изведено с интервал като разделител, в противен случай празен низ ще бъде добавен към предишния изход, състоящ се от фамилно име, запетая и собствено име.