2016-04-13 7 views
1

Это мой tblEmp стол и tblDept таблица (я использую MS-SQL Server 2012), когда я пытаюсь использовать перекрестное соединение этих двух таблиц это дает мне результат, который я не ожидал, просто хотел узнать, почему это кросс-соединение дает такой результат, спасибо.Неожиданный результат перекрестного соединения

ID Name Gender Salary Dept_id 
1 abc male  2004 1 
2 Tom female 5004 2 
3 Sara female 29404 2 
4 Jim male  8604 3 
5 Lisan male 2078 1 
6 Brad male 9804 3 
7 Diana female 2095 2 
8 Henry male 28204 2 
9 Mark male 20821 1 
10 Miley female 9456 1 
11 Richie male 8604 NULL 
12 Lisan female 20776 NULL 

tblDept

ID Dept_Name   Location 
1 IT    Mumbai 
2 HR    Delhi 
3 Accounts   London 
4 OtherDepartment NewYork 

это перекрестное соединение запрос и его вывод

select Name, Gender, Salary, Dept_Name 
from tblEmp 
CROSS JOIN tblDept 
where tblEmp.Dept_id is NULL 

ВЫВОД

Name Gender Salary Dept_Name 
Richie male 8604 IT 
Richie male 8604 HR 
Richie male 8604 Accounts 
Richie male 8604 OtherDepartment 
Lisan female 20776 IT 
Lisan female 20776 HR 
Lisan female 20776 Accounts 
Lisan female 20776 OtherDepartment 

Что я ожидал, что-то вроде этого

Name Gender Salary Dept_Name 
    Richie male 8604 NULL 
    Richie male 8604 NULL 
    Richie male 8604 NULL 
    Richie male 8604 NULL 
    Lisan female 20776 NULL 
    Lisan female 20776 NULL 
    Lisan female 20776 NULL 
    Lisan female 20776 NULL 
+1

Пропустить пункт WHERE. Что вы получаете? Имеет ли смысл текущий результат, если вы повторно вводите предложение WHERE? – jarlh

+2

Ваши ожидания ошибочны. «Cross join» не соответствует строкам между таблицами. Вам просто нужно подумать об этом и попробовать другие «кросс-соединения», я думаю, чтобы полностью понять, почему результаты верны. –

+0

@jarlh Пропуск предложения where извлекает мне ненулевые записи – Deepesh

ответ

1

Результат правильный: cross join предоставит вам все комбинации на основе двух таблиц: tblEmp и tblDept.

И так как вы используете Dept_Name как комбинация, без ИНЕКЕ, это даст вам все возможные комбинации возможных между вашими двумя таблицами:

Name Gender Salary Dept_Name 
abc male  2004 IT 
abc male  2004 HR 
abc male  2004 Accounts 
abc male  2004 OtherDepartment 
Tom female 5004 IT 
Tom female 5004 HR 
Tom female 5004 Accounts 
Tom female 5004 OtherDepartment 

... and so on 

Richie male 8604 IT 
Richie male 8604 HR 
Richie male 8604 Accounts 
Richie male 8604 OtherDepartment 
Lisan female 20776 IT 
Lisan female 20776 HR 
Lisan female 20776 Accounts 
Lisan female 20776 OtherDepartment 

То есть, кросс-присоединение, вы фактически получаете 12 (от tblEmp) х 4 (от tblDept) = 48 строк

Тогда ваша статья, где будет просто отнять все, кроме Richie и Lisan, так как два из них являются единственными, имеющие Dept_id = NULL

Name Gender Salary Dept_Name 
Richie male 8604 IT 
Richie male 8604 HR 
Richie male 8604 Accounts 
Richie male 8604 OtherDepartment 
Lisan female 20776 IT 
Lisan female 20776 HR 
Lisan female 20776 Accounts 
Lisan female 20776 OtherDepartment 

Если запрос Dept_id колонка тоже

select Name, Gender, Salary, Dept_id, Dept_Name 
from tblEmp 
CROSS JOIN tblDept 
where tblEmp.Dept_id is NULL 

Результат будет понятнее, как вы на самом деле получить только сотрудникам Dept_id = NULL:

Name Gender Salary Dept_id Dept_Name 
Richie male 8604 NULL IT 
Richie male 8604 NULL HR 
Richie male 8604 NULL Accounts 
Richie male 8604 NULL OtherDepartment 
Lisan female 20776 NULL IT 
Lisan female 20776 NULL HR 
Lisan female 20776 NULL Accounts 
Lisan female 20776 NULL OtherDepartment 

Ваш Dept_Name колонка поставляется с 4 tblDept не от tblEmp записей.

+0

его сейчас довольно ясно .. спасибо – Deepesh

+0

@Deepesh привет, отлично. :) Да, я пытаюсь объяснить объяснение, чтобы разъяснить, что – Ian

+1

@lan Действительно ценю ваше усилие ... это помогло мне понять, присоединиться к более отчетливому – Deepesh

2

CROSS JOIN даст вам каждую строку первой таблицы присоединиться с каждой строкой второй таблицы, (декартово произведение), если не добавить условие, используя Where пункт для соединения двух таблиц (и в этом случае, он ведет себя как внутреннее соединение)

Вот быстрая демонстрация Креста присоединиться:

DECLARE @A table 
(
    A1 int identity(1,1), 
    A2 int 
) 

DECLARE @B table 
(
    B1 int identity(1,1), 
    B2 int 
) 

INSERT INTO @A VALUES (1), (2), (NULL) 

INSERT INTO @B VALUES (4), (5), (6) 

SELECT * 
FROM @A 
CROSS JOIN @B 

результатов:

A1   A2   B1   B2 
----------- ----------- ----------- ----------- 
1   1   1   4 
2   2   1   4 
3   NULL  1   4 
1   1   2   5 
2   2   2   5 
3   NULL  2   5 
1   1   3   6 
2   2   3   6 
3   NULL  3   6 

Как вы можете видеть, для каждой записи в таблице @A, вы присоединитесь каждую запись таблицы @B

SELECT * 
FROM @A 
CROSS JOIN @B 
WHERE A2 IS NULL 

Результаты:

A1   A2   B1   B2 
----------- ----------- ----------- ----------- 
3   NULL  1   4 
3   NULL  2   5 
3   NULL  3   6 

Как вы можете видеть, для каждая запись в таблице @A, где A2 имеет значение null, вы присоединяетесь к каждой записи таблицы @B.

+0

Да, я получил эту вещь. – Deepesh

0

Если вам нужно показать всех сотрудников и их отделов, вы можете использовать LEFT JOIN:

SELECT Name, Gender, Salary, Dept_Name 
FROM 
    tblEmp AS E 
    LEFT JOIN 
    tblDept AS D 
     ON E.Dept_id = D.ID 

Результат:

Name Gender Salary Dept_Name 
abc  male 2004 IT 
Tom  female 5004 HR 
Sara female 29404 HR 
Jim  male 8604 Accounts 
Lisan male 2078 IT 
Brad male 9804 Accounts 
Diana female 2095 HR 
Henry male 28204 HR 
Mark male 20821 IT 
Miley female 9456 IT 
Richie male 8604 NULL 
Lisan female 20776 NULL 

ИЛИ

Если вам нужно показать все сотрудники и все отделы , вы можете использовать ПОЛНЫЙ ПРИСОЕДИНЯЙТЕСЬ:

SELECT Name, Gender, Salary, Dept_Name 
FROM 
    tblEmp AS E 
    FULL JOIN 
    tblDept AS D 
     ON E.Dept_id = D.ID 

Результат:

Name Gender Salary Dept_Name 
abc  male 2004 IT 
Tom  female 5004 HR 
Sara female 29404 HR 
Jim  male 8604 Accounts 
Lisan male 2078 IT 
Brad male 9804 Accounts 
Diana female 2095 HR 
Henry male 28204 HR 
Mark male 20821 IT 
Miley female 9456 IT 
Richie male 8604 NULL 
Lisan female 20776 NULL 
NULL NULL NULL OtherDepartment 
0

Если вы хотите строку NULL для каждого отдела на человека, который имеет нулевое dept_id например,

Name Gender Salary Dept_Name 
Richie male 8604 NULL 
Richie male 8604 NULL 
Richie male 8604 NULL 
Richie male 8604 NULL 
Lisan female 20776 NULL 
Lisan female 20776 NULL 
Lisan female 20776 NULL 
Lisan female 20776 NULL 

вы могли бы выполнить это ...

select Name, Gender, Salary, NULL AS Dept_Name 
from tblEmp 
CROSS JOIN tblDept 
where tblEmp.Dept_id is NULL 
Смежные вопросы