SQL-фильтрация строк без повторяющихся значений

Привет, так что я новичок в SQL, и я пытаюсь найти способ, в котором я могу получить только строки, которые имеют значения, которые не дублируются друг другу в определенном столбце таблицы.

Например, приведенная ниже таблица называется T1 и содержит:

ID|Branch ID
1     444
2     333
3     444
4     111
5     555
6     333

Результат, который я хочу, будет

ID|Branch ID
4     111
5     555

Таким образом, показаны только не повторяющиеся строки

Edit: я хочу применить это к большому реляционному коду. Вот фрагмент того, где я хочу его добавить

FROM dbo.LogicalLine
          INNER JOIN dbo.Page ON dbo.LogicalLine.page_id = dbo.Page.id
          INNER JOIN dbo.Branch ON dbo.LogicalLine.branch_id = dbo.Branch.id

Таблица LogicalLine будет иметь столбец branch_id, содержащий повторяющиеся значения идентификаторов. Я хочу отфильтровать тех, кто показывает только не повторяющийся branch_id, как в примере выше, а затем внутренний присоединить таблицу ветвей в LogicalLine, который я сделал.

Добавлено-полный код здесь:

SELECT  

(SELECT name
 FROM ParentDevice
 WHERE (Dev1.type NOT LIKE '%cable%') AND (id = Dev1.parent_device_id))T1_DeviceID,

(SELECT name
 FROM Symbol
 WHERE (id = CP1.symbol_id) AND (type NOT LIKE '%cable%'))T1_DeviceName,

(SELECT name
 FROM Location
 WHERE (id = Page.location_id))T1_Location,

(SELECT name
 FROM Installation
 WHERE (id = Page.installation_id))T1_Installation,

(SELECT name
 FROM ParentDevice
 WHERE (Dev2.type NOT LIKE '%cable%') AND (id = Dev2.parent_device_id))T2_DeviceID,

(SELECT name
 FROM Symbol
 WHERE ( id = CP2.symbol_id) AND (type NOT LIKE '%cable%'))T2_DeviceName,

(SELECT name
 FROM Location
 WHERE (id = PD2.location_id))T2_Location,

(SELECT name
 FROM Installation
 WHERE (id = Page.installation_id))T2_Installation,

(SELECT devicefamily
 FROM Device
 WHERE (type LIKE '%cable%') AND (id = SymCable.device_id))CablePartNumber,

(SELECT name
 FROM ParentDevice
 WHERE (id = DevCable.parent_device_id) AND (DevCable.type LIKE '%cable%'))CableTag

FROM dbo.LogicalLine
          INNER JOIN dbo.Page ON dbo.LogicalLine.page_id = dbo.Page.id
          INNER JOIN dbo.Branch ON dbo.LogicalLine.branch_id = dbo.Branch.id
          LEFT OUTER JOIN dbo.Symbol AS SymCable ON dbo.LogicalLine.cable_id = SymCable.id
          LEFT OUTER JOIN dbo.Device AS DevCable ON SymCable.device_id = DevCable.id
          LEFT OUTER JOIN dbo.ParentDevice AS ParentCable ON DevCable.parent_device_id = ParentCable.id
          INNER JOIN dbo.SymbolCP AS CP1 ON dbo.Branch.cp1_id = CP1.id
          INNER JOIN dbo.SymbolCP AS CP2 ON dbo.Branch.cp2_id = CP2.id
          INNER JOIN dbo.Symbol AS S1 ON CP1.symbol_id = S1.id
          INNER JOIN dbo.Symbol AS S2 ON CP2.symbol_id = S2.id
          INNER JOIN dbo.Device AS Dev1 ON S1.device_id = Dev1.id
          INNER JOIN dbo.Device AS Dev2 ON S2.device_id = Dev2.id
          INNER JOIN dbo.ParentDevice AS PD1 ON Dev1.parent_device_id = PD1.id
          INNER JOIN dbo.ParentDevice AS PD2 ON Dev2.parent_device_id = PD2.id
          INNER JOIN dbo.Location AS L1 ON PD1.location_id = L1.id 
          INNER JOIN dbo.Location AS L2 ON PD2.location_id = L2.id 
          INNER JOIN dbo.Installation AS I1 ON L1.installation_id = I1.id
          INNER JOIN dbo.Installation AS I2 ON L2.installation_id = I2.id

WHERE 
         (PD1.project_id = @Projectid)  AND (dbo.LogicalLine.drawingmode LIKE '%Single Line%'); 
Метки

1 ответ

  1. Select Id, BranchId from table t
    Where not exists
       (Select * from table
        where id != t.Id 
           and BranchId = t.BranchId)
    

    или

     Select Id, BranchId
     From table
     Group By BranchId
     Having count(*) == 1
    

    EDIT: чтобы изменить запрос, просто добавьте предложение complete SQL queryWhere:

     Select l.Id BranchId, [plus whatever else you have in your select clause]
     FROM LogicalLine l
          join Page p ON p.id = l.page_Id 
          join Branch b ON b.Id = l.branch_id 
     Group By l.branch_id, [Plus whatever else you have in Select clause]
     Having count(*) == 1
    

    или

    Select l.Id BranchId, [plus whatever else you have in your select clause]
    FROM LogicalLine l
          join Page p on p.id = l.page_Id 
          join Branch b on b.Id = l.branch_id 
    Where not exists
       (Select * from LogicalLine 
        where id != l.Id 
           and branch_id = l.branch_id)