복붙노트

[SQL] UNION, INTERSECT 및 EXCEPT에 대한 SQLEXCEPTION

SQL

UNION, INTERSECT 및 EXCEPT에 대한 SQLEXCEPTION

이 예외 가진 사람의 도움을 날 수 있을까? 나는 그것이 의미하거나 수정하는 방법을 ... 그것은 다음과 같은 메시지와 SQLException이 무엇인지 이해하지 않는다 :

이처럼 보이는 의사 코드에서 쿼리를 실행할 때 나는 그것을 얻을 :

// Some filtering of data
var query = data.Subjects
            .Where(has value)
            .Where(has other value among some set of values);

// More filtering, where I need to have two different options
var a = query
            .Where(some foreign key is null);
var b = query
            .Where(some foreign key is not null)
            .Where(and that foreign key has a property which is what I want);
query = a.Union(b);

// Final filter and then get result as a list
var list = query
            .Where(last requirement)
            .ToList();

나는 a.Union (B) 부분을 제거하는 경우, 그것은 예외없이 실행됩니다. 내가 아는 그래서 오류가 있습니다. 그런데 왜 나는 그것을받을 수 있나요? 그리고 어떻게 그것을 해결할 수 있습니까? 여기 너무 미친 일을하고 있습니까? 유무 나는 연합 (EU)의 일을 사용하는 방법을 오해?

기본적으로 내가 무엇을해야하는 다른 개체에 대한 외래 키가 일부 기관이다. 그리고 나도 널 (null)이거나 곳 외국 기업이 몇 가지 요구 사항을 충족 해당 외래 키가 설정되어있는 모든 개체를 얻을 필요가있다.

해결법

  1. ==============================

    1.생성 된 SQL에 문제가 같은이 외모 때문에, 당신은 어느 쪽 SQL 프로파일 러를 사용, 또는 Visual Studio의 출력 창에 SQL을 작성하는 DebuggerWritter 클래스에이 코드를 사용하려고합니다.

    생성 된 SQL에 문제가 같은이 외모 때문에, 당신은 어느 쪽 SQL 프로파일 러를 사용, 또는 Visual Studio의 출력 창에 SQL을 작성하는 DebuggerWritter 클래스에이 코드를 사용하려고합니다.

    SQL 오류는 일반적으로 UNION에 대한 검색 필드로 인해 발생하면이 쿼리에 대해 동일하지 않습니다. 첫 번째 쿼리는 3 개 필드가있을 수 있지만, 두 번째 쿼리는 4 개 필드가 예를 들어,이 오류가 발생합니다. 따라서, 생성 된 SQL을보고 확실히이 경우에 도움이 될 것입니다.

  2. ==============================

    2.SQL 오류에서 판단 당신은 내가했다 동일한 문제가 발생할 수 있습니다 나열. 기본적 때 Linq는이 투사 달성하기 위해 동일하게 유지해야한다는 사실에 관계없이 별도로 각 프로젝션을 최적화 SQL에 Linq에 버그가 있음을 표시 두 개의 서로 다른 쿼리에 CONCAT 또는 연합 확장 방법을 사용하여 SQL 쿼리에 대한 는 SQL 연합 (EU).

    SQL 오류에서 판단 당신은 내가했다 동일한 문제가 발생할 수 있습니다 나열. 기본적 때 Linq는이 투사 달성하기 위해 동일하게 유지해야한다는 사실에 관계없이 별도로 각 프로젝션을 최적화 SQL에 Linq에 버그가 있음을 표시 두 개의 서로 다른 쿼리에 CONCAT 또는 연합 확장 방법을 사용하여 SQL 쿼리에 대한 는 SQL 연합 (EU).

    참고 :

    SQL에 LINQ는 UNION 또는 CONCAT를 사용하여 잘못된 TSQL을 생산

    SQL 연합 (EU) 같은도 fieldName 생성 오류에 LINQ

    나는 다음과 같이 나를 위해 노력하고 해결책을 찾은 것뿐 아니라이 당신의 문제가 발생합니다.

    var queryA = 
        from a in context.TableA
        select new 
        {
            id,
            name,
            onlyInTableA,
        }
    
    var queryB = 
        from b in context.TableB
        let onlyInTableA = default(string)
        select new 
        {
            id,
            name,
            onlyInTableA,
        }
    
    var results = queryA.Union(queryB).ToList();
    
  3. ==============================

    3.당신은 아마도 그것은 하나의 쿼리에서 쓸 수 있습니까?

    당신은 아마도 그것은 하나의 쿼리에서 쓸 수 있습니까?

    .Where(row => row.ForeignKey == null || row.ForeignKey.SomeCondition);
    

    이 표현 (OrElse라는)를 병합하는 방법도 있지만, 그 사소한 아니다.

    오류가 있지만, 어디에서 오는지 확실하지!

    편집 : 그것을 테스트하지 않은,하지만 이것은 UNION 논리적으로 동일해야한다 :

    public static IQueryable<T> WhereAnyOf<T>(
        this IQueryable<T> source,
        params Expression<Func<T, bool>>[] predicates)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (predicates == null) throw new ArgumentNullException("predicates");
        if (predicates.Length == 0) return source.Where(row => false);
        if (predicates.Length == 1) return source.Where(predicates[0]);
    
        var param = Expression.Parameter(typeof(T), "row");
        Expression body = Expression.Invoke(predicates[0], param);
        for (int i = 1; i < predicates.Length; i++)
        {
            body = Expression.OrElse(body,
                Expression.Invoke(predicates[i], param));
        }
        return source.Where(Expression.Lambda<Func<T, bool>>(body, param));
    }
    
  4. ==============================

    4.안 좋은 생각이 캡처 된 변수 ... 오류의 가능성이 원인을 돌연변이합니다.

    안 좋은 생각이 캡처 된 변수 ... 오류의 가능성이 원인을 돌연변이합니다.

    UPDATE : 확인되지

    여기에 또 다른 생각이다. 힌트는 오류 메시지입니다.

    var a = query
             .Where(some foreign key is null)
             .Select(x => x);
    

    아니면이 동일하게 할 때까지 또 다른 '가짜'를 추가하여 플레이 :)

  5. ==============================

    5.나는 data.GetCommand (쿼리)를 호출하고 결과 DbCommand (특히 생성 된 SQL 문자열)을 분석한다. 그것은 당신에게 무엇이 잘못되었는지에 대한 단서를 제공해야합니다.

    나는 data.GetCommand (쿼리)를 호출하고 결과 DbCommand (특히 생성 된 SQL 문자열)을 분석한다. 그것은 당신에게 무엇이 잘못되었는지에 대한 단서를 제공해야합니다.

    나는 두 대상 목록이 동일하게 기대 있도록 어디에 가고에는 돌출부가 없습니다.

    당신은 여전히 ​​작동하지 않는 작은 하나에 쿼리를 줄이기 위해 시도 할 수 있습니다. query.Union (쿼리)와 시작 (이해야 적어도 일). 추가보다 당신이 작동을 중지 할 때 볼 하나 하나를 호출합니다.

    그것은 당신의 선택 목록에 추가 열을 추가 귀하의 경우 통화 중 하나 여야합니다.

  6. ==============================

    6.당신은 변수에 '선택'옆에 값을 전달 혹시, 아니면 당신은 두 번 이상 같은 필드를 반환하는? SP1이가 그런 것들을 밖으로 '최적화'를 시도하고 그 통합 쿼리가 중단 될 수 있습니다 버그를 도입 (때문에 밖으로 '최적화'쿼리 부분에 서로 다른 전달 된 PARAMS).

    당신은 변수에 '선택'옆에 값을 전달 혹시, 아니면 당신은 두 번 이상 같은 필드를 반환하는? SP1이가 그런 것들을 밖으로 '최적화'를 시도하고 그 통합 쿼리가 중단 될 수 있습니다 버그를 도입 (때문에 밖으로 '최적화'쿼리 부분에 서로 다른 전달 된 PARAMS).

    당신이 의사 코드가 아닌 실제 쿼리를 게시 할 경우이 경우인지를 쉽게 식별 할 수 있습니다.

    (그리고이 경우라면 해결 먼저 개별 부품을 실현하고 클라이언트 측 (L2O) 조합을 할 것이다).

  7. ==============================

    7.jpierson 제대로 정리 문제가있다. 또한 문제, SELECT 문에 일부 리터럴에 의한이 시간을 보냈습니다 : TestDataContext.Table1에서 t에서 어둡게 결과 = (_ 어디 t.ID = WantedID _ 선택 t.name, SpecialField = 0, AnotherSpecialField = 0, T. 주소) .Union _ TestDataContext.Table1에서 t에서 _ 어디 t.SecondID = WantedSecondID _ 선택 t.name, SpecialField = 1, AnotherSpecialField = 0, T. 주소)

    jpierson 제대로 정리 문제가있다. 또한 문제, SELECT 문에 일부 리터럴에 의한이 시간을 보냈습니다 : TestDataContext.Table1에서 t에서 어둡게 결과 = (_ 어디 t.ID = WantedID _ 선택 t.name, SpecialField = 0, AnotherSpecialField = 0, T. 주소) .Union _ TestDataContext.Table1에서 t에서 _ 어디 t.SecondID = WantedSecondID _ 선택 t.name, SpecialField = 1, AnotherSpecialField = 0, T. 주소)

    "SpecialField = 0"과 "AnotherSpecialField = 0"의 제 1 서브 쿼리 분명히 실패 조합에 사용되는 하나 개의 필드 대신 두 결과 최적화 하였다. 나는 SpecialField & AnotherSpecialField가 많은 제 2 서브 쿼리처럼, 서로 다른 값을 한 것으로 나타 그래서 첫 번째 쿼리를 변경했다.

  8. ==============================

    8.그럼 난이 발생하는 문제가 있었다. SQL을 08 사용 나는 INT와 두 경우 모두 문자열을 반환이 개 테이블 함수를했다. 나는 UNION을 시도하는 복잡한 객체와 사용 LINQ를 만들었습니다. IEqualityComparer를했다하면을 비교 한 작업을 수행합니다. 모든 벌금을 컴파일하지만, 지원되지 않는 과부하로 추락했다. 좋아, 내가 문제가 defered 실행의 입맛을 보였다 논의했다 깨달았다. 내가 컬렉션을 얻고, 장소 ToList () 그래서, 다음 UNION을하고 그것을 모두 좋다. 이 도움이 될 것입니다,하지만 나를 위해 작동하지 않도록하는 경우

    그럼 난이 발생하는 문제가 있었다. SQL을 08 사용 나는 INT와 두 경우 모두 문자열을 반환이 개 테이블 함수를했다. 나는 UNION을 시도하는 복잡한 객체와 사용 LINQ를 만들었습니다. IEqualityComparer를했다하면을 비교 한 작업을 수행합니다. 모든 벌금을 컴파일하지만, 지원되지 않는 과부하로 추락했다. 좋아, 내가 문제가 defered 실행의 입맛을 보였다 논의했다 깨달았다. 내가 컬렉션을 얻고, 장소 ToList () 그래서, 다음 UNION을하고 그것을 모두 좋다. 이 도움이 될 것입니다,하지만 나를 위해 작동하지 않도록하는 경우

  9. from https://stackoverflow.com/questions/650847/sqlexception-about-union-intersect-and-except by cc-by-sa and MIT license