Перекрестное соединение против внутреннего соединения в SQL Server 2008 с



В чем разница между CROSS JOIN и INNER JOIN?



CROSS JOIN:



SELECT 
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status],
FROM
Customers
CROSS JOIN
Movies


ВНУТРЕННЕЕ СОЕДИНЕНИЕ:



SELECT 
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status]
FROM
Customers
INNER JOIN
Movies ON Customers.CustomerID = Movies.CustomerID


какой из них лучше и почему я должен использовать один?

717   10  

10 ответов:

Cross join не объединяет строки, Если у вас есть 100 строк в каждой таблице с 1 до 1 матча, вы получаете 10.000 результатов, Innerjoin будет возвращать только 100 строк в той же ситуации.

эти 2 примера вернут тот же результат:

Cross join

select * from table1 cross join table2 where table1.id = table2.fk_id

внутреннее соединение

select * from table1 join table2 on table1.id = table2.fk_id

используйте последний метод

вот лучший пример перекрестного соединения и внутреннего соединения.

рассмотрим следующие таблицы

стол : Teacher

x------------------------x
| TchrId   | TeacherName | 
x----------|-------------x
|    T1    |    Mary     |
|    T2    |    Jim      |
x------------------------x

стол : Student

x--------------------------------------x
|  StudId  |    TchrId   | StudentName | 
x----------|-------------|-------------x            
|    S1    |     T1      |    Vineeth  |
|    S2    |     T1      |    Unni     |
x--------------------------------------x

1. ВНУТРЕННЕЕ СОЕДИНЕНИЕ

внутреннее соединение выбирает строки, которые удовлетворяют обе таблицы.

Считайте, нам нужно найти учителей, классных руководителей и их учеников. В том условие, мы должны применить JOIN или INNER JOIN и

enter image description here

запрос

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId

результат

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

2. КРЕСТ ПРИСОЕДИНИТЬСЯ

Cross join выбирает все строки из первой таблицы и все строки из второй таблицы и показывает как декартово произведение ie, со всеми возможности

Считайте, что нам нужно найти всех учителей в школе и учеников независимо от классных руководителей, нам нужно подать заявку CROSS JOIN.

enter image description here

запрос

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
CROSS JOIN #Student S 

результат

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T2    |     Jim     |    Vineeth  |
|    T2    |     Jim     |    Unni     |
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

CROSS JOIN = (INNER) JOIN = запятая (",")

TL; DR единственная разница между SQL перекрестное соединение, (внутренняя) присоединение и запятая (",") (кроме запятой, имеющих низкий приоритет для оценки того), что (внутренний) вступить в то время как перекрестное соединение и запятая не.


повторное промежуточными продуктами

все три производят промежуточный концептуальный реляционный "Декартовый" "перекрестный" продукт SQL-стиля возможные комбинации строк из каждой таблицы. Он включен и / или где это уменьшает количество строк. SQL Fiddle

стандарт SQL определяет через продукт (7.5 1.b. ii), через (7.7 1.a) и присоединиться к через плюс где (7.7 1.си.)

как говорит Википедия:

Cross join

CROSS JOIN возвращает декартово произведение строк из таблицы в соединении. Другими словами, он будет создавать строки, которые объединяют каждую строку из первой таблицы с каждой строкой из второй таблицы.

внутреннее соединение

[...] Результат соединения может быть определен как результат первого взятия Декартового произведения (или перекрестного соединения) всех записей в таблицах (объединения каждой записи в таблице A с каждой записью в таблице B), а затем возврата всех записей, которые удовлетворяют предикат соединения.

"неявная нотация соединения" просто перечисляет таблицы для объединения в предложении FROM инструкции SELECT, используя запятые для их разделения. Таким образом, он указывает перекрестное соединение

Re внешний присоединяется & на vs где в них видят условия в левом соединении (внешнее соединение) против внутреннего соединения.

зачем сравнивать столбцы между таблицами?

каждый таблица содержит строки, что принять верное утверждение от определенного заполнения-[назвали]бланки шаблон заявления. (Это делает true предложение С--отвечает--определенный (характеристика) предикат.)

  • базовая таблица содержит строки, которые делают истинный оператор из некоторого шаблона оператора DBA:

    /* rows where
    customer C.CustomerID has age C.Age and ...
    */
    FROM Customers C
    
  • промежуточный продукт соединения содержит строки, которые делают истинное утверждение из шаблонов и его операндов:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    */
    FROM Customers C CROSS JOIN Movies M
    
  • ON & WHERE условия ANDed in, чтобы дать дополнительный шаблон. Значение снова строки, которые удовлетворяют этому шаблону:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    AND C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    AND C.Age = 18
    */
    FROM Customers C CROSS JOIN Movies M
    ON C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    WHERE C.Age = 18
    

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

просто напишите SQL для шаблона для строк, которые вы хотите!

Re значение запросов (и таблиц против условий) см.:
как получить соответствующие данные из другой таблицы SQL для двух разных столбцов: Inner Join и / или Union?
есть ли какое-либо эмпирическое правило для построения SQL-запроса из читаемого человеком описание?

перегрузка "cross join"

к сожалению, термин "перекрестное соединение" используется для:

  • промежуточный продукт.
  • ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ.
  • (внутреннее) соединение с ON или где это не сравнивает столбцы из одной таблицы с любыми столбцами другой. (Поскольку это имеет тенденцию возвращать так много строк промежуточного продукта.)

использование перекрестного соединения против (внутреннего) соединения против запятая

принято:

  • используйте перекрестное соединение, когда и только когда вы не сравниваете столбцы между таблицами. То есть показать, что отсутствие сравнений было преднамеренным.
  • используйте (внутреннее) соединение с ON, когда и только когда вы сравниваете столбцы между таблицами (плюс, возможно, другие условия.)
  • не используйте запятую.

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

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

Re "не использовать запятую" смешивание запятой с явным соединением может ввести в заблуждение, потому что запятая имеет более низкий приоритет. Но учитывая роль промежуточного продукта в значении CROSS JOIN, (INNER) JOIN и запятая, аргументов для конвенции выше нет использование его вообще шатко. Перекрестное соединение или запятая-это точно так же, как (внутреннее) соединение, которое находится в истинном состоянии. Промежуточный продукт, на и где все вводят и в соответствующем предикате. Однако еще можно подумать о внутреннем соединении-скажем, о создании выходной строки только при нахождении пары входных строк, удовлетворяющих условию ON, - тем не менее он возвращает строки перекрестного соединения, удовлетворяющие условию. Единственная причина на С дополнить запятую в SQL было написать внешний присоединяется. Конечно, выражение должно прояснять свой смысл, но то, что ясно, зависит от того, что понимать под этим.

повторное диаграммы Венна диаграмма Венна с двумя пересекающимися кругами может проиллюстрировать разницу между вывод строк для внутренних, левых, правых и полных соединений для одного и того же входа. И когда ON безусловно истинен, результат внутреннего соединения такой же, как и CROSS JOIN. Также он может проиллюстрировать вход & выходные строки для INTERSECT, UNION & EXCEPT. И когда оба входа имеют одинаковые столбцы, результат пересечения совпадает со стандартным естественным соединением SQL. Но это так не проиллюстрируйте, как (внутреннее) соединение работает в целом. Вот только кажется правдоподобным на первый взгляд. Он может определить некоторые части ввода и/или вывода для особых случаях ON, PKS (первичные ключи), FKs (внешние ключи) и/или SELECT. Все, что вам нужно сделать, чтобы увидеть это чтобы идентифицировать какие именно ограничения и каковы именно элементы множеств, представленных кругами. (Что в этих особых случаях re частей никогда не ясно.) (Помните, что вообще выходные строки имеют разные заголовки от входных строк.)

Внутреннее Соединение

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

синтаксис для внутреннего соединения

SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name

Cross Join

перекрестное соединение, которое создает декартово произведение таблиц, участвующих в соединении. Размер Декартового произведения - это количество строк в первой таблице, умноженное на количество строк во второй стол.

синтаксис для перекрестного соединения

SELECT * FROM table_name1
CROSS JOIN table_name2

или мы можем написать его по-другому также

SELECT * FROM table_name1,table_name2

проверить сейчас запрос ниже для перекрестного соединения

пример

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

или

SELECT * FROM UserDetails, OrderDetails

пожалуйста, помните, если предложение WHERE добавляется, перекрестное соединение ведет себя как внутреннее соединение. Например, следующие запросы Transact-SQL создают один и тот же результирующий набор. Пожалуйста, обратитесь к http://technet.microsoft.com/en-us/library/ms190690 (v=sql. 105). aspx

SQL Server также принимает более простую нотацию:

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

используя эту более простую нотацию, не нужно беспокоиться о разнице между внутренними и перекрестными соединениями. Вместо двух предложений " ON "существует одно предложение" WHERE", которое выполняет эту работу. Если у вас есть какие-либо трудности в выяснении, какие предложения "JOIN" "ON" идут куда, откажитесь от нотации "JOIN" и используйте более простую выше.

Это не обман.

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

при написании запроса с помощью cross join результат похож на декартово произведение no записей в обеих таблицах. пример если таблица 1 содержит 2 записи, а Таблица 2 содержит 3 записи, то результатом запроса будет 2*3 = 6 записей.

Так что не идти на крест присоединиться, пока вам не нужно что.

Cross join и inner join одинаковы с той лишь разницей, что в inner join мы логически фильтруем некоторые результаты декартова произведения

table1
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    option1  |
|    A     |      B1     |    option2  |
x--------------------------------------x

table2
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    optionB1 |
|    A1    |      B1     |    optionB2 |
x--------------------------------------x

 cross join
  A,B,option1,A,B,optionB1
  A,B,option1,A1,B1,optionB2
  A,B1,option2,A,B,optionB1
  A,B1,option2,A1,B1,optionB2

 inner join on field1 (only with the value is the same in both tables)
  A,B,option1,A,B,optionB1
  A,B1,option2,A,B,optionB1

 inner join on field1
  A,B,option1,A,B,optionB1

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

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

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

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

Если предложение WHERE используется с перекрестным соединением, оно функционирует как внутреннее соединение.

Comments

    Ничего не найдено.