从连接创建唯一值的表

时间:2018-01-16 17:39:12

标签: sql sql-server

我有两张包含各种地址的表格。一个是我们已经存档的位置表,另一个是新业务。我的想法是,我在他们的坐标上加入这两个表格,以显示我们是否在新业务与当前业务之间发生冲突。

我发现在新业务中我们有一个位置与我们已经拥有的三个位置相匹配。

当我进行简单的内部联接时,我真的想要显示4个记录(新的1个,当前的3个)。我尝试了其他连接和联合以及子查询,但没有运气。我知道有办法,但无法弄清楚。

SELECT *
FROM NewBusiness
INNER JOIN Live L ON N.Latitude = L.Latitude AND N.Longitude = L.Longitude

提前致谢

3 个答案:

答案 0 :(得分:1)

也许不是最好的答案(它在同一个表中捕获重复的行)但仍能正常工作

select distinct 'oldbiz', l.id, l.latitude, l.longitude
  from Live l, NewBusiness n
 where l.latitude = n.latitude
  and l.longitude = n.longitude
union all
select distinct 'newbiz', n.id, n.latitude, n.longitude
 from Live l, NewBusiness n
where l.latitude = n.latitude
  and l.longitude = n.longitude

SQLFIDDLE

答案 1 :(得分:0)

所以我能够通过工会得到我认为你正在寻找的东西。它可能不是最好的方法,但看起来它的工作原理。我做了一个SQL小提琴来展示它。

你可以在这里看到小提琴:SQLFIDDLE

进行测试,我创建了两个表,Live和NewBusiness。 像这样创建它们

CREATE TABLE Live
    ([ID] varchar(1), [latitude] int, [longitude] int)
;

INSERT INTO Live
    ([ID], [latitude], [longitude])
VALUES
    ('a', 1, 2),
    ('b', 1, 2),
    ('c', 1, 2),
    ('d', 4, 3),
    ('e', 5, 4),
    ('k', 5, 7),
    ('l', 5, 9),
    ('M', 5, 7)
;

CREATE TABLE NewBusiness
    ([ID] varchar(1), [latitude] int, [longitude] int)
;

INSERT INTO NewBusiness
    ([ID], [latitude], [longitude])
VALUES
    ('f', 1, 2),
    ('g', 5, 2),
    ('h', 1, 8),
    ('i', 6, 3),
    ('z', 5, 7),
    ('y', 12, 4),
    ('x', 5, 7)
;

我使用的查询是

 (    
   SELECT L.ID
           ,L.Latitude
           ,L.Longitude

    FROM Live L
    INNER JOIN NEWBUSINESS N 
    ON L.Latitude = N.Latitude AND L.Longitude = N.Longitude
 )
 UNION
 (
   SELECT N.ID 
           ,N.LATITUDE 
           ,N.LONGITUDE 
    FROM NEWBUSINESS N
    INNER JOIN Live L 
    ON N.Latitude = L.Latitude AND N.Longitude = L.Longitude
    GROUP BY N.ID
            ,N.LATITUDE
            ,N.LONGITUDE 
   )

联盟的第一部分获得Live中与Newbusiness匹配的所有内容。联盟的第二部分获得Newbusiness中与Live相匹配的所有内容。结果然后结合在一起。

表:

Live 
ID  latitude    longitude
a   1   2
b   1   2
c   1   2
d   4   3
e   5   4
k   5   7
l   5   9
M   5   7

**NewBusiness**
ID  latitude    longitude
f   1   2
g   5   2
h   1   8
i   6   3
z   5   7
y   12  4
x   5   7

**Query Results**
ID  Latitude    Longitude
a   1   2
b   1   2
c   1   2
f   1   2
k   5   7
M   5   7
x   5   7
z   5   7

答案 2 :(得分:0)

这样的事情会给你所需要的东西(对于任何一张表中另一张表中有匹配的记录,它会计算一次):

WITH cte1
AS
(
    SELECT
        N.latitude
        , N.longitude
        , ROW_NUMBER() OVER (ORDER BY N.latitude, N.longitude) r1
    FROM NewBusiness N
)
,

cte2
AS
(
    SELECT
        N.latitude
        , N.longitude
        , ROW_NUMBER() OVER (PARTITION BY N.r1 ORDER BY N.latitude, N.longitude) r2
    FROM
        cte1 N
        JOIN Live L ON
            N.Latitude = L.Latitude
            AND N.Longitude = L.Longitude
)

SELECT
    latitude
    , longitude
    , 'NewBusiness' sourceTable
FROM cte2
WHERE r2 = 1

UNION ALL

SELECT
    latitude
    , longitude
    , sourceTable
FROM
    (
        SELECT DISTINCT
            latitude
            , longitude
            , r2
            , 'Live' sourceTable
        FROM cte2
    ) Q