[SQL] cross duplication over twee kolommen filteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • stavast
  • Registratie: Mei 2004
  • Laatst online: 27-10-2022
Ik zit nu al drie nachten te sparren met een SQL Query die ik wil gebruiken voor een project dat ik heb. Volgens mij is hij redelijk simpel, maar ik zie het gewoon niet meer na al het puzzelen.

Wat ik heb is een tabel met daarin de volgende waarden:
Hierin is RelationType een referentie naar Type en andersom.

DeviceTypeRelationType
1AC
1B
1CA
1D
2E
4FH
4G
4HF


Ik wil graag de duplicaten filteren zodat ik het volgende overhoud:

DeviceTypeRelationType
1AC
1B
1D
2E
4FH
4G


Ik ben zo ver gekomen dat ik volgende query heb:
SQL:
1
2
3
4
5
SELECT row_number() over(order by e.Device) AS 'ID', t.Device, t.Type, r.RelationType
FROM TabelNaam t
JOIN TabelNaam r
ON t.Type < r.RelationType
WHERE t.Type=r.Type


bovenstaande geeft, op ID na, het volgende weer:
DeviceTypeRelationType
1AC
4FH


ik krijg het dus niet voor elkaar om de overige Devices ook te laten zien, degene waarbij geen relatie is.
Volgens mij mis ik een Left Outer Join ergens. wie zou mij weer op gang kunnen helpen?

alvast bedankt!

[ Voor 7% gewijzigd door stavast op 05-10-2011 03:07 ]


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

Left joinen klinkt als een goed idee, maar dan wel met de juiste voorwaarde (wel waarde in t, niet perse in r)

Dan krijg je volgens mij iets als dit:
SQL:
1
2
3
4
5
SELECT row_number() over(order by e.Device) AS 'ID', t.Device, t.Type, r.RelationType
FROM TabelNaam t
LEFT JOIN TabelNaam r
ON t.Type=r.Type
WHERE t.Type < r.RelationType

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Als al die duplicaten paartjes zijn, dan is er niet eens een join nodig, dan is type < relationtype or relationtype is null al goed genoeg.

[ Voor 9% gewijzigd door _js_ op 05-10-2011 06:33 ]


Acties:
  • 0 Henk 'm!

  • stavast
  • Registratie: Mei 2004
  • Laatst online: 27-10-2022
allebei bedankt. met behulp van een combinatie van jullie hulp heb ik het voor elkaar gekregen! Heb alleen nog een "AND t.Device IS NOT NULL" toegevoegd.

heel erg bedankt!

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
KompjoeFriek schreef op woensdag 05 oktober 2011 @ 04:10:
Left joinen klinkt als een goed idee, maar dan wel met de juiste voorwaarde (wel waarde in t, niet perse in r)

Dan krijg je volgens mij iets als dit:
SQL:
1
2
3
4
5
SELECT row_number() over(order by e.Device) AS 'ID', t.Device, t.Type, r.RelationType
FROM TabelNaam t
LEFT JOIN TabelNaam r
ON t.Type=r.Type
WHERE t.Type < r.RelationType
Als je left joinen een goed idee vindt, kom dan niet zelf met een inner join.
stavast schreef op woensdag 05 oktober 2011 @ 14:26:
allebei bedankt. met behulp van een combinatie van jullie hulp heb ik het voor elkaar gekregen! Heb alleen nog een "AND t.Device IS NOT NULL" toegevoegd.

heel erg bedankt!
Raar, als je dat toevoegt aan je oorspronkelijke query dan verandert er niks.

Acties:
  • 0 Henk 'm!

  • stavast
  • Registratie: Mei 2004
  • Laatst online: 27-10-2022
GlowMouse schreef op woensdag 05 oktober 2011 @ 22:04:
[...]

Als je left joinen een goed idee vindt, kom dan niet zelf met een inner join.

[...]

Raar, als je dat toevoegt aan je oorspronkelijke query dan verandert er niks.
eum.. misschien dat ik meer bedoelde als "met de hulp die jullie mij hebben gegeven ben ik tot een oplossing gekomen"

het eind resultaat ziet er nu als volgt uit:

SQL:
1
2
3
4
5
6
7
8
SELECT     TOP (100) PERCENT row_number() OVER (partition BY e.Device
ORDER BY e.Device) AS ID, e.Device, e.Type, r.RelationType
FROM         dbo.TabelNaam1 AS e INNER JOIN
                      dbo.TabelNaam2 ON e.Device = dbo.TabelNaam2.Device LEFT OUTER JOIN
                      dbo.TabelNaam1 AS r ON e.Type = r.Type
WHERE     (e.Type < r.RelationType) AND (e.Device IS NOT NULL) OR
                      (e.Device IS NOT NULL) AND (r.RelationType IS NULL)
ORDER BY e.Device


ik heb er een andere tabel bij betrokken om zodoende tot een meer gespecificeerde tabel te komen die voor mijn doel erg handig is.

eigenlijk wil ik nog één optie toevoegen, maar weet eigenlijk niet of zoiets bestaat met normale sql instructies.

graag zou ik aan de hand van een waarde uit een andere kolom de data in de juiste view-kolom zetten. In TabelNaam1 heb ik een kolom opgenomen die die de afkomst weergeeft. Afkomst kan zijn X of Y. De huidige view zou ik dan willen aanpassen zodat wanneer het om afkomst X gaat, de waarde in Type komt. wanneer de afkomst Y is, dan moet de aarde in RelationType komen. Is zoiets überhaupt mogelijk?

uitgaande van het origineel:
DeviceTypeRelationType
1AC
1B
1D
2E
4FH
4G



de uiteindelijk uitkomst zou dan als volgt eruit kunnen zien:

DeviceTypeRelationType
1CA
1B
1D
2E
4FH
4G


is het correct als ik het wijzig naar dit? de uitkomst is namelijk wat ik wil.. maar zitten er misschien adders onder het gras?..

SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT     TOP (100) PERCENT row_number() OVER (partition BY e.Device
ORDER BY e.Device) AS ID, 
e.Device, 
(select Device from dbo.TabelNaam1 where TypeXY = 'X' and (Device = e.Device or Device = r.RelationType)) as Type_X, 
(select Device from dbo.TabelNaam1 where TypeXY = 'Y' and (Device = r.RelationType or Device = e.Device)) as Type_Y,
FROM         dbo.TabelNaam1 AS e INNER JOIN
                      dbo.TabelNaam2 ON e.Device = dbo.TabelNaam2.Device LEFT OUTER JOIN
                      dbo.TabelNaam1 AS r ON e.Type = r.Type
WHERE     (e.Type < r.RelationType) AND (e.Device IS NOT NULL) OR
                      (e.Device IS NOT NULL) AND (r.RelationType IS NULL)
ORDER BY e.Device

[ Voor 14% gewijzigd door stavast op 08-10-2011 02:09 ]

Pagina: 1