문제

공통적 인 결과가없는 테이블이나 뷰에서 쿼리를 통합 할 수 있습니까? 내가하려는 것은 다른보기의 데이터를 하나의 결과로 결합하는 것입니다. 나는 가지고있다

select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3

결과가 a, b, z, c입니다. 내가 선택한 곳입니까? 그것은 어떻게 생겼습니까?

select ? from (
select a,b,null,c from VIEW1, VIEW2 where VIEW1.a = VIEW2.a
UNION
select null,null,z,null from VIEW3)

MS SQL Server를 사용하고 있으며 뷰에는 기본 키가 없습니다. 정말 고마워.

도움이 되었습니까?

해결책

내가 당신의 질문을 이해한다면, 당신은 아마도 다음과 같은 결과를 얻고있을 것입니다.

a1, b1, null, c1
a2, b2, null, c2
a3, b2, null, c3
null, null, z1, null
null, null, z2, null
null, null, z3, nul

.. 그러나 당신이 얻으려고하는 것은 다음과 같은 결과입니다.

a1, b1, z1, c1
a2, b2, z2, c2
a3, b2, z3, c3

문제를 올바르게 이해합니까?

이것이 올바른 경우,이 하위 쿼리에 합류 할 수있는 방법이 있어야하므로 SQL에 1이 함께 가고 2가 함께 갈 수 있다고 말할 수 있습니다.

다른 팁

노조는 결과 세트를 연결하고 결합하지 않습니다.

따라서 첫 번째 쿼리에서 얻을 수있는 것은 다음과 같습니다.

  a      b    (null)  c
(null) (null)   z    (null)

결합하려면 그것들을 결합하려면 그것들에 가입해야하고 공통점이 있거나 프로그램의 데이터를 결합해야합니다.

각각에서 1 행 밖에 없습니까?

그렇다면 위의 패턴이 항상 그렇게 될 경우 효과가 있습니다.

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

그러나 view3.a가 값인지 view1.a가 값을 가지고 있는지 알지 못하고 값 3이 있으면 첫 번째 쿼리에서 값을 원한다면 다음이 작동합니다.

SELECT COALESCE(SQ1.a, SQ2.a) a, COALESCE(SQ1.b, SQ2.b) b,
    COALESCE(SQ1.z, SQ2.z) z, COALESCE(SQ1.c, SQ2.c) c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

그러나, 그리고 여기에는 큰 것이 있습니다. 두 뷰 중 하나 이상의 행이 있다면 함께 속하지 않은 데이터로 끝날 것입니다. 이 경우, 당신 ~ 해야 하다 공통점이있다.

결과와 함께 시도한 전체 코드는 다음과 같습니다.

USE master
GO

DROP DATABASE TestDB
GO

CREATE DATABASE TestDB
GO

USE TestDB
GO

CREATE TABLE View1
(
    a INT,
    b INT,
    c INT
)
GO

CREATE TABLE View2
(
    a INT,
    z INT
)
GO

CREATE TABLE View3
(
    z INT
)
GO

INSERT INTO View1 (a, b, c) VALUES (10, 20, 30)
GO

INSERT INTO View2 (a, z) VALUES (10, 40)
GO

INSERT INTO View3 (z) VALUES (50)
GO


SELECT View1.a, b, NULL z, c
FROM View1 INNER JOIN View2 ON View1.a = View2.a
UNION
SELECT NULL a, NULL b, z, NULL c
FROM View3

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

SELECT COALESCE(SQ1.a, SQ2.a) a, COALESCE(SQ1.b, SQ2.b) b,
    COALESCE(SQ1.z, SQ2.z) z, COALESCE(SQ1.c, SQ2.c) c
FROM (
    SELECT 1 k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT 1 k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

결과:

a           b           z           c
----------- ----------- ----------- -----------
NULL        NULL        50          NULL
10          20          NULL        30

(2 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30

(1 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30

(1 row(s) affected)

다음과 같이 view3에 단일 행을 추가하면 다음과 같습니다.

INSERT INTO View3 (z) VALUES (51)

그런 다음이 결과를 얻을 수 있습니다. 두 배의 행을 주목하십시오.

a           b           z           c
----------- ----------- ----------- -----------
NULL        NULL        50          NULL
NULL        NULL        51          NULL
10          20          NULL        30

(3 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30
10          20          51          30

(2 row(s) affected)

a           b           z           c
----------- ----------- ----------- -----------
10          20          50          30
10          20          51          30

(2 row(s) affected)

내가 이것을 이해한다면 : 당신은 당신의 결과를 '붕괴'하고 모든 널을 제거하려고합니까? 그렇다면 View3의 결과는 View1/View2의 결과에 해당합니까? 그렇다면 관계는 무엇입니까? 그렇지 않다면 결과 수가 적어도 일치합니까?


여러 레코드의 경우 Row_number () 접근 방식이 저에게 효과적이었습니다. Select 1 K 접근법은 직교 제품을 반환하는 것이 었습니다.

SELECT SQ1.a, SQ1.b, SQ2.z, SQ1.c
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY a) k, View1.a, b, NULL z, c
    FROM View1 INNER JOIN View2 ON View1.a = View2.a) SQ1
INNER JOIN (
    SELECT ROW_NUMBER() OVER (ORDER BY b) k, NULL a, NULL b, z, NULL c
    FROM View3) SQ2 ON SQ1.k = SQ2.k

당신이 이런 것을 찾고 있다는 것이 될 수 있습니까? (그냥 거친 추측)

SELECT 
  VIEW1.a,
  VIEW1.b,
  (SELECT TOP 1 z FROM VIEW3) AS z,
  VIEW2.c
FROM
  VIEW1, VIEW2 
WHERE
  VIEW1.a = VIEW2.a

Union을 포함한 모든 SQL Select의 결과는 정적 열 세트입니다. (다형성 없음)

그러나 각 행에 모든 열을 사용할 필요는 없으며 열에 값이없는 행에서 NULL 값을 사용합니다. 또한 클라이언트가 주어진 행에 대해 유형 (및 흥미로운 열)을 알릴 수 있도록 '유형'행을 포함하는 것이 좋습니다.

예시:

 (Select
   'room' as view_type
 , rooms.room as room
 , NULL as color
 From rooms 
 )
UNION ALL
(Select
  'color' as view_type
 , NULL as room
 , colors.color as color
 From colors 
)

실제로 크로스 가입을 원합니다.

V1.A, V1.B, View3.Z, v1.c에서 (a, b, c, view2에서 v1.a = view2.a)에서 v1 cross 조인 view3를 선택하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top