【问题标题】:inner join using same table使用同一张表进行内连接
【发布时间】:2015-04-15 09:29:29
【问题描述】:

我有两个需要加入的 sql 查询(来自 1 个表),但是当我尝试加入它们时总是出错。

第一个表:这是完整的表。

Select Server, Network, ReservationIP, ReservationMAC, ReservationName
from ScopeReservations 

结果(被截断了。这是一个非常表格)

> Server    Network ReservationIP   ReservationMAC  ReservationName
> Server1   10.3.64.32  10.3.64.36  000d5d08e83c    pr-bnea06-a01-a
> Server2   10.3.64.32  10.3.64.37  000d5d08278c    pr-bnea06-a02-a

第二张表:所有在 ReservationMAC 中有重复值的表

 Select ReservationMAC, COUNT(*) from DHCP_ScopeReservations
    group by ReservationMAC
    having count(*) > 1
    order by ReservationMAC

结果:

ReservationMAC  (No column name)
0000850a3477    2
0000854b8328    2
85731867    2

我需要的结果是这样的。

Server  Network         ReservationIP   ReservationMAC  ReservationName
Server1 10.233.192.0    10.233.192.5    0000850a3477    pq2217a.
Server2 10.233.196.0    10.233.197.129  0000850a3477    pq2217.
Server1 10.80.16.0      10.80.17.13     0000854b8328    PQ090.
Server2 10.80.70.32     10.80.70.47     0000854b8328    Canon4B8328.

另外,结果不应包含具有相同reservationIP 和reservationMAC 的那些。 未包含在结果中:

Server  Network     ReservationIP  ReservationMAC   ReservationName
Server1 10.34.57.0  10.34.57.10    011               vh101r
Server2 10.34.57.1  10.34.57.10    011               vh102r
Server1 10.206.0.0  10.206.3.22    0000681569af      ac-gpo069
Server2 10.206.0.0  10.206.3.22    0000681569af      ac-gpo069

结果应该是所有在 ReservationMac 列中有重复条目的结果。结果必须包含表的所有列。


我想做什么:

Select a.Server, a.Network, a.ReservationIP, a.ReservationMAC,
a.ReservationName 
from DHCP_ScopeReservations a
INNER JOIN 
    (
        Select ReservationMAC, COUNT(*)
        from DHCP_ScopeReservations
        group by ReservationMAC
        having count(*) > 1
    ) dt ON a.ReservationMAC=dt.ReservationMAC

错误是

消息 8155,第 16 级,状态 2,第 6 行 没有为“dt”的第 2 列指定列名。

【问题讨论】:

    标签: sql-server join


    【解决方案1】:

    使用JOIN 可以获得所需的结果,如下所示:

    SELECT Server, Network, ReservationIP, s.ReservationMAC, ReservationName
    FROM ScopeReservations s
    JOIN (
      SELECT ReservationMAC 
      FROM DHCP_ScopeReservations
      GROUP BY ReservationMAC
      HAVING COUNT(ReservationMAC) > 1
    ) dupe
    ON s.ReservationMAC = dupe.ReservationMAC
    

    【讨论】:

    • 还有一件事。我需要添加一个 where 子句以从最终结果中删除具有相同 reservationIP 的那些。这可能吗。删除此输出:(标题)“Server Network ReservationIP ReservationMAC ReservationName”(第一个结果)Server1 10.16.175.0 10.16.175.203 000081 ups-mume-042a(第二个结果)Server2 10.64.160.0 10.64.177.61 000081 pq2331
    • @lulala 对不起,我不明白。 same reservationIP 是什么意思?
    • 现在一切都好。我发布了一个不同的问题。 - stackoverflow.com/questions/29664962/join-two-queried-tables/…
    【解决方案2】:

    你需要为COUNT(*)声明一个别名:

    Select a.Server, a.Network, a.ReservationIP, 
           a.ReservationMAC, a.ReservationName, dt.cnt 
    from DHCP_ScopeReservations a   
    INNER JOIN (Select ReservationMAC, COUNT(*) AS cnt
                from DHCP_ScopeReservations             
                group by ReservationMAC               
                having count(*) > 1) dt 
    ON a.ReservationMAC=dt.ReservationMAC
    

    使用cnt 别名,您现在可以访问外部查询的SELECT 子句中的重复数。

    【讨论】:

    猜你喜欢
    • 2023-02-23
    • 2015-08-16
    • 2020-11-03
    • 1970-01-01
    • 2011-09-02
    • 2013-01-07
    • 1970-01-01
    • 2011-09-30
    • 2017-07-17
    相关资源
    最近更新 更多