4

タイプと互換性のないSQLステートメントがあるSql Geometryため、機能するように改良しようとしています。

その基本的な要点は次のようなものです。

Select distinct A,B,C,D,SHAPE FROM TABLE1 UNION SELECT A,B,C,D,SHAPE FROM TABLE2

そのため、2 つの異なる (しかし類似した) テーブルに対する複雑な個別ステートメントの結果は結合されます。

問題は、SQL Geometry型 (SHAPE フィールド) は比較可能な型ではないため、別個のステートメントに含めることができないことです。

SHAPEユニオンに参加する両方のサブクエリからフィールドを削除しても問題ありません。しかし、それらのサブクエリが解析された後にそれを取り戻したいです。SHAPE列 A の値がわかっている場合は、フィールドを取得できます。

だから私の質問は: 2 つのサブクエリの個別のステートメントからフィールドを削除し、別の列 (A) に結合して結果セットにそのフィールドを (残りのフィールドと共に) 戻すにはどうすればよいですか?

4

3 に答える 3

4

VARBINARY(MAX) にキャストしてからキャストバックできます。

create table tbl1 ( ID int, a int, b char(3), d geometry );
create table tbl2 ( ID int, a int, b char(3), d geometry, other float );
insert tbl1 (ID, a, b, d) values
    (1, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)),
    (2, 3, 3, geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)),
    (3, 4, 3, geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)),
    (4, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 250 0, 150 150, 0 150, 0 0))', 0)),
    (5, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 350 0, 150 150, 0 150, 0 0))', 0))
insert tbl2 (ID, a, b, d) values
    (6, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0)), -- same as tbl1.ID=1
    (7, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 950 0, 150 150, 0 150, 0 0))', 0)),
    (8, 2, 3, geometry::STGeomFromText('POLYGON ((0 0, 350 0, 150 150, 0 150, 0 0))', 0)); -- same as tbl1.ID=5

SELECT A, B, cast(c as geometry) c
FROM
(
    Select A,B,cast(D as varbinary(max)) c FROM tbl1
    UNION
    SELECT A,B,cast(D as varbinary(max)) FROM tbl2
) X;
于 2012-12-06T21:06:18.330 に答える
0

これは機能しますか?

with cte as (
Select distinct A,B,C,D FROM TABLE1
)
select c.A,c.B,c.C,c.D,t.SHAPE 
FROM cte as c
inner join TABLE1 as t
   on c.A = t.A
UNION 
SELECT A,B,C,D,SHAPE FROM TABLE2
于 2012-12-07T02:42:10.590 に答える
0
CREATE VIEW GeometryView1 AS
  SELECT A,B,C,D,SHAPE AS tabId FROM TABLE1 
  UNION SELECT A,B,C,D,SHAPE FROM TABLE2;

CREATE VIEW GeometryView2 AS
  SELECT DISTINCT A,B,C,D FROM (
  SELECT A,B,C,D AS tabId FROM TABLE1 
  UNION SELECT A,B,C,D FROM TABLE2) x;

SELECT DISTINCT v2.A,v2.B,v2.C,v2.D,v1.SHAPE FROM GeometryView2 v2 , GeometryView1 v1
WHERE v2.A=v1.A AND v2.B=v1.B AND v2.C=v1.C AND v2.D=v1.D 
于 2012-12-06T21:22:48.083 に答える