5 개의 테이블을 조인하기위한 LINQ에 대한 SQL 쿼리

레이

결과를 얻으려는 테이블이 5 개 있습니다. 아래는 내 테이블 디자인입니다.

응용 프로그램 및 환경 테이블 :

Id, Name

참고-위의 표는 모두 동일한 속성을 갖습니다.

ResourceGroup 테이블 :

Id, Name, Application_Id

ResourceGroupEnvironment 테이블 :

Id, ResourceGroup_Id, Environment_Id, VIP, URL

서버 테이블 :

Id, ServerName, Alias, IPAddress, Network

ServerResourceGroup 테이블 :

Id, Server_Id, ResourceGroup_Id, Environment_Id

어떤 결과를 얻으려고합니까?

위의 테이블 디자인을 기반으로 테이블 ResourceGroupApplication테이블의 일부인 모든 서버를 가져올 것으로 예상 합니다. ResourceGroupEnvironmentServerResourceGroup테이블 공유 environment표는 ResourceGroupEnvironment하나의 공통 환경을해야하지만 ServerResourceGroup그 환경에서 여러 서버를 가질 수 있습니다.

그래서 , ResourceGroupEnvironment가입하려고 했지만 서버에 대한 중복 항목이 있지만 각 항목은 다른 . 예제는 JSON의 중복 레코드 아래를 참조하십시오.VIPURLserversvipURL

{
    "serverId": 1,
    "applicationName": "TestApp",
    "resourceName": "Test AppFabric",
    "serverName": "Server1",
    "aliasName": null,
    "os": "Windows Server 2008",
    "ipAddress": "192.168.1.1",
    "vip": "10.1.1.1",
    "url": "www.google.com",
    "environmentName": "DEV",
},
{
    "serverId": 1,
    "applicationName": "TestApp",
    "resourceName": "Test AppFabric",
    "serverName": "Server1",
    "aliasName": null,
    "os": "Windows Server 2008",
    "ipAddress": "192.168.1.1",
    "vip": "10.2.2.3",
    "url": "www.testui.com",
    "environmentName": "DEV",
}

그렇다면 JSON의 위 레코드에 어떤 문제가 있습니까?

글쎄, 나는 데이터베이스에서 하나의 레코드를 다시 가져와야 environment합니다. DEV환경에 여러 서버가있는 경우 여러 서버를 반환해야하지만 각 서버 레코드에 가입 VIP하고 참여해야 URL합니다. 당신은 통지, 경우 VIP그리고 URL그들은 두 개의 서로 다른 환경에 속하는, 독특합니다. 이러한은 10.1.1.1 VIP에 속하는 DEV환경과 10.2.2.3다른 환경에 속한다 PROD.

예외로 작동하지 않는 linq에서 작성한 쿼리는 다음과 같습니다.

var query = from rg in _context.ResourceGroup
            join sr in _context.ServersResourceGroup on rg.Id equals sr.ResourceGroup_id
            join rge in _context.ResourceGroupEnvironment on sr.Environment_id equals rge.Environment_id into lrges
            from lrge in lrges.DefaultIfEmpty()
            join s in _context.Servers on sr.Server_id equals s.Id
            join e in _context.Environments on sr.Environment_id equals e.Id
            join a in _context.Applications on rg.Application_Id equals a.Id
            join d in _context.Domains on s.Domain_Id equals d.Id
            join t in _context.Types on rg.Type_Id equals t.Id
            join o in _context.OperatingSystems on s.OperatingSystem_Id equals o.Id
            join n in _context.NetworkZones on s.NetworkZone_Id equals n.Id
            join stat in _context.Status on s.Status.Id equals stat.Id
            where a.Name.ToLower() == applicationName.ToLower()
            select new SearchListViewModel()
            {
                serverId = s.Id,
                resourceName = rg.Name,
                applicationName = a.Name,
                serverName = s.ServerName,
                aliasName = s.Alias,
                os = o.OSVersion,
                ipAddress = s.IPAddress,
                vip = lrge.VIP,
                url = lrge.EndPointURL,
                domain = d.Name,
                network = n.Name,
                typeName = t.Name,
                environmentName = e.Name,
                status = stat.Name
            };

        return query.ToList();

SQL 쿼리 :

내 자신의 SQL 쿼리를 작성하면 제대로 작동하고 올바른 레코드를 제공합니다. 아래 SQL 쿼리를 참조하십시오.

select rg.Name as ResourceName, s.ServerName, rge.VIP, rge.EndPointURL
from ResourceGroup as rg
join ServersResourceGroup as srg on rg.Id = srg.ResourceGroup_id
join Servers as s on srg.Server_id = s.Id
left join ResourceGroupEnvironment as rge on srg.Environment_id = rge.Environment_id

모든 사람의 도움을받은 후에 작동 한 솔루션은 다음과 같습니다.

 var query = from rg in _context.ResourceGroup
                    join srg in _context.ServersResourceGroup on rg.Id equals srg.ResourceGroup_id
                    join s in _context.Servers on srg.Server_id equals s.Id
                    join a in _context.Applications on rg.Application_Id equals a.Id
                    join e in _context.Environments on srg.Environment_id equals e.Id
                    join d in _context.Domains on s.Domain_Id equals d.Id
                    join t in _context.Types on rg.Type_Id equals t.Id
                    join n in _context.NetworkZones on s.NetworkZone_Id equals n.Id
                    join o in _context.OperatingSystems on s.OperatingSystem_Id equals o.Id
                    join stat in _context.Status on s.Status_Id equals stat.Id
                    join rge in _context.ResourceGroupEnvironment on srg.Environment_id equals rge.Environment_id into lrges
                    from lrge in lrges.DefaultIfEmpty()
                    select new SearchListViewModel()
                    {
                        serverId = s.Id,
                        serverName = s.ServerName,
                        aliasName = s.Alias,
                        domain = d.Name,
                        environmentName = e.Name,
                        network = n.Name,
                        os = o.OSVersion,
                        ipAddress = s.IPAddress,
                        vip = lrge == null ? string.Empty : lrge.VIP,
                        url = lrge == null ? string.Empty : lrge.EndPointURL,
                        typeName = t.Name,
                        applicationName = a.Name,
                        resourceName = rg.Name,
                        status = stat.Name
                    };

        return query.ToList();
이고르

귀하의 쿼리

SELECT rg.Name AS ResourceName, s.ServerName, rge.VIP, rge.EndPointURL
FROM ResourceGroup AS rg
JOIN ServersResourceGroup AS srg ON rg.Id = srg.ResourceGroup_id
JOIN Servers AS s ON srg.Server_id = s.Id
LEFT JOIN ResourceGroupEnvironment AS rge ON srg.Environment_id = rge.Environment_id

이 Linq 문으로 번역 할 수 있습니다.

var query = from rg in _context.ResourceGroup
    join srg in _context.ServersResourceGroup on rg.Id equals srg.ResourceGroup_id
    join s in _context.Servers on srg.Server_id equals s.Id
    from rge in _context.ResourceGroupEnvironment.Where(x => srg.Environment_id = x.Environment_id).DefaultIfEmpty()
    select new{
        ResourceName = rg.Name, 
        s.ServerName, 
        rge.VIP, 
        rge.EndPointURL
    };
var queryResults = query.ToList();

다시 사과와 사과를 비교해야합니다. 쿼리에서 11 개의 테이블을 조인하고 where있고 다른 결과의 원인이 될 수있는 예제 쿼리에서 모두 생략 된 절이 있습니다. 귀하의 의견에 따라이 답변은 SQL 스크립트에 포함 된 4 개의 테이블에 중점을 둡니다.


마지막 (외부) 조인 정보 : LINQ by LINQ의 LEFT OUTER JOIN 질문에 대한 답변을 참조하세요 @Stefan Steiger. 이것은 구문 IMO를 읽기가 더 쉽지만 구문을 사용하는 방법 또는 다른 방법 join이 작동합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

3 개의 테이블을 조인하기위한 쿼리

분류에서Dev

SQL Server의 3 개 테이블에 대한 피벗 쿼리

분류에서Dev

LINQ C #에 대한 SQL 쿼리 [여러 테이블 조인]

분류에서Dev

테이블을 재사용하는 3 개의 테이블에 대한 SQL 쿼리

분류에서Dev

LINQ 쿼리에 대한 하위 쿼리의 not in 절이있는 SQL 쿼리

분류에서Dev

SQL을 사용하는 Access의 5 개 테이블에 대한 내부 조인 및 왼쪽 조인

분류에서Dev

테이블을 생성하기위한 이미지에 대한 SQL 쿼리

분류에서Dev

LINQ에 대한 SQL 쿼리 (두 개의 키로 조인 사용)

분류에서Dev

조건부 테이블 2 개에 대한 SQl 쿼리

분류에서Dev

SQL의 3 개 테이블에서 정보를 검색하기위한 쿼리?

분류에서Dev

3 개의 테이블에 대한 SQL 조인 쿼리가 작동하지 않음

분류에서Dev

열 이름이 다른 3 개의 테이블에 대한 SQL 쿼리

분류에서Dev

하위 쿼리 및 테이블 조인에 대한 SQL 도움말

분류에서Dev

PL SQL의 테이블을 포함하는 변수에 대한 쿼리

분류에서Dev

5 개의 테이블을 결합하는 SQL 쿼리

분류에서Dev

5 개의 테이블을 결합하는 SQL 쿼리

분류에서Dev

두 개의 열을 키로 사용하는 두 테이블에 대한 SQL 쿼리

분류에서Dev

두 테이블을 조인하기위한 복잡한 SQL 쿼리

분류에서Dev

동일한 테이블에서 2 개의 조건을 기준으로 개수를 얻기위한 단일 SQL 쿼리

분류에서Dev

카테고리 트리를 형성하는 2 개의 테이블에 대한 SQL 쿼리

분류에서Dev

SQL Server의 열 값에 따라 열이있는 테이블을 가져 오기위한 SQL 쿼리 디자인

분류에서Dev

한 쿼리에서 한 테이블의 SQL 하위 그룹

분류에서Dev

다른 테이블의 값에 대한 SQL 쿼리

분류에서Dev

ORACLE의 emp 및 dept 테이블에 대한 SQL 쿼리

분류에서Dev

SQL Server의 테이블에 대한 특성 쌍 쿼리

분류에서Dev

동일한 테이블에 대한 SQL 하위 쿼리

분류에서Dev

동일한 테이블에 대한 하위 쿼리 / 조인

분류에서Dev

여러 항목의 한 행만 가져 오기 위해 4 개의 테이블을 조인하는 Oracle SQL 쿼리

분류에서Dev

조인 된 테이블의 값을 사용하여 단일 테이블에 대한 MySQL 업데이트 쿼리

Related 관련 기사

  1. 1

    3 개의 테이블을 조인하기위한 쿼리

  2. 2

    SQL Server의 3 개 테이블에 대한 피벗 쿼리

  3. 3

    LINQ C #에 대한 SQL 쿼리 [여러 테이블 조인]

  4. 4

    테이블을 재사용하는 3 개의 테이블에 대한 SQL 쿼리

  5. 5

    LINQ 쿼리에 대한 하위 쿼리의 not in 절이있는 SQL 쿼리

  6. 6

    SQL을 사용하는 Access의 5 개 테이블에 대한 내부 조인 및 왼쪽 조인

  7. 7

    테이블을 생성하기위한 이미지에 대한 SQL 쿼리

  8. 8

    LINQ에 대한 SQL 쿼리 (두 개의 키로 조인 사용)

  9. 9

    조건부 테이블 2 개에 대한 SQl 쿼리

  10. 10

    SQL의 3 개 테이블에서 정보를 검색하기위한 쿼리?

  11. 11

    3 개의 테이블에 대한 SQL 조인 쿼리가 작동하지 않음

  12. 12

    열 이름이 다른 3 개의 테이블에 대한 SQL 쿼리

  13. 13

    하위 쿼리 및 테이블 조인에 대한 SQL 도움말

  14. 14

    PL SQL의 테이블을 포함하는 변수에 대한 쿼리

  15. 15

    5 개의 테이블을 결합하는 SQL 쿼리

  16. 16

    5 개의 테이블을 결합하는 SQL 쿼리

  17. 17

    두 개의 열을 키로 사용하는 두 테이블에 대한 SQL 쿼리

  18. 18

    두 테이블을 조인하기위한 복잡한 SQL 쿼리

  19. 19

    동일한 테이블에서 2 개의 조건을 기준으로 개수를 얻기위한 단일 SQL 쿼리

  20. 20

    카테고리 트리를 형성하는 2 개의 테이블에 대한 SQL 쿼리

  21. 21

    SQL Server의 열 값에 따라 열이있는 테이블을 가져 오기위한 SQL 쿼리 디자인

  22. 22

    한 쿼리에서 한 테이블의 SQL 하위 그룹

  23. 23

    다른 테이블의 값에 대한 SQL 쿼리

  24. 24

    ORACLE의 emp 및 dept 테이블에 대한 SQL 쿼리

  25. 25

    SQL Server의 테이블에 대한 특성 쌍 쿼리

  26. 26

    동일한 테이블에 대한 SQL 하위 쿼리

  27. 27

    동일한 테이블에 대한 하위 쿼리 / 조인

  28. 28

    여러 항목의 한 행만 가져 오기 위해 4 개의 테이블을 조인하는 Oracle SQL 쿼리

  29. 29

    조인 된 테이블의 값을 사용하여 단일 테이블에 대한 MySQL 업데이트 쿼리

뜨겁다태그

보관