본문 바로가기

트레이닝

Join 쿼리

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqGeneric
{

    #region Join
    class Join
    {
        class Department
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
        
        class Sex
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }

        class Employee
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int DeptId { get; set; }
        }
        static void Main(string[] args)
        {
            List<Department> departments = new List<Department>();
            departments.Add(new Department { Id = 1, Name = "Account" });
            departments.Add(new Department { Id = 2, Name = "Sales" });
            departments.Add(new Department { Id = 3, Name = "Marketing" });

            List<Sex> sex = new List<Sex>();
            sex.Add(new Sex { Id = 0, Name = "남자" });
            sex.Add(new Sex { Id = 1, Name = "여자" });

            List<Employee> employees = new List<Employee>();
            employees.Add(new Employee { DeptId = 0, Type = 2, Id = 1, Name = "William" });
            employees.Add(new Employee { DeptId = 2, Type = 2, Id = 2, Name = "Miley" });
            employees.Add(new Employee { DeptId = 1, Type = 1, Id = 3, Name = "Benjamin" });

            var list = (from e in employees
                        join d in departments on e.DeptId equals d.Id
                        select new
                        {
                            EmployeeName = e.Name,
                            DepartmentName = d.Name
                        });

            Console.WriteLine("\n내부 조인(join) :");

            //양쪽에 데이터가 일치하여야 표시.
            foreach (var e in list)
            {
                Console.WriteLine("직원명 = {0} , 부서명 = {1}", e.EmployeeName, e.DepartmentName);
            }

            // Create the query.
            var leftOuter =
               from e in employees
               join d in departments on e.DeptId equals d.Id into deptGroup
               select deptGroup.DefaultIfEmpty(new Department() { Name = "Empty", Id = e.DeptId });

            Console.WriteLine("\n외부 조인(Outer join) :");
            int totalItems = 0;

            //LINQ는 왼쪽 조인만을 지원.
            //왼쪽의 데이터를 모두 보여 주고 오른쪽 데이터는 없으면 Empty 를 넣어 표시.
            foreach (var e in leftOuter)
            {
                Console.WriteLine("Group:{0,5} ea", e.Count());
                foreach (var item in e)
                {
                    totalItems++;
                    Console.WriteLine("부서명 = {0} , 부서Id = {1}", item.Name, item.Id);
                }
                Console.WriteLine();
            }
            Console.WriteLine("LeftOuterJoin:  그룹 {1} 의 아이템 {0} ", totalItems, leftOuter.Count());

            //그룹 조인은 결과값이 그룹으로 구성되며, 기본적으로 내부 조인입니다.
            //왼쪽 데이터는 모두 있으나 일치 하지 않는 데이터는 제외 표시. 
            Console.WriteLine("\nGroup Join :");
            totalItems = 0;

            var groupJoin =
               from e in employees
               join d in departments on e.DeptId equals d.Id into deptGroup
               select deptGroup;

            foreach (var e in groupJoin)
            {
                foreach (var item in e)
                {
                    totalItems++;
                    Console.WriteLine("부서명 = {0} , 부서Id = {1}", item.Name, item.Id);
                }
                Console.WriteLine("Group Join:  그룹 {1} 의 아이템 {0} ", totalItems, groupJoin.Count());
                Console.WriteLine();
            }
            
            // Create the query.
            var leftCaseOuter =
               from e in employees
               join d in departments on e.DeptId equals d.Id into deptGroup
               from dd in deptGroup.DefaultIfEmpty(new Department() { Name = "Empty", Id = e.DeptId })
               join s in sex on e.DeptId equals s.Id into sexGroup
               from rr in sexGroup.DefaultIfEmpty(new Sex() { Name = "Empty", Id = e.DeptId })
               select new Employee() { Name = (e.Type.Equals(1) ? dd.Name : rr.Name), Id = e.Id, DeptId = e.DeptId, Type = e.Type };

            leftCaseOuter.ToList().ForEach(
                       row => Console.WriteLine("left Case Join: {0} {1}", row.DeptId, row.Name));

            Console.WriteLine("\n아무 키나 누르세요.");
            Console.ReadKey();
        }
    }
    #endregion
}

결과

내부 조인(join) :
직원명 = Miley , 부서명 = Sales
직원명 = Benjamin , 부서명 = Account

외부 조인(Outer join) :
Group:    1 ea
부서명 = Empty , 부서Id = 0

Group:    1 ea
부서명 = Sales , 부서Id = 2

Group:    1 ea
부서명 = Account , 부서Id = 1

LeftOuterJoin:  그룹 3 의 아이템 3

Group Join :
Group Join:  그룹 3 의 아이템 0

부서명 = Sales , 부서Id = 2
Group Join:  그룹 3 의 아이템 1

부서명 = Account , 부서Id = 1
Group Join:  그룹 3 의 아이템 2

left Case Join: 0 남자
left Case Join: 2 Empty
left Case Join: 1 Account

아무 키나 누르세요.

SQL

-- JOIN
SELECT e.Name EmployeeName, d.Name DepartmentName
FROM employees e INNER JOIN departments d
ON e.DeptId = d.Id;

-- LEFT JOIN
SELECT e.Name EmployeeName, d.Name DepartmentName
FROM employees e LEFT OUTER JOIN departments d
ON e.DeptId = d.Id;

--GROUP JOIN
SELECT d.Id DepartmentId, d.Name DepartmentName, COUNT(e.Name) EmployeeCount
FROM Customers e LEFT OUTER JOIN Regions d
ON e.RegionId = d.Id
GROUP BY d.Id, d.Name;

'트레이닝' 카테고리의 다른 글

블레이저 앱 개발을 위한 환경 설정  (0) 2021.02.15
블레이저란 무엇인가?  (0) 2021.02.14
Where 쿼리  (0) 2020.07.08
쿼리 연산자  (0) 2020.07.08
라우팅.  (0) 2020.07.08