sql >> Databáze >  >> RDS >> PostgreSQL

Jak najít vztah z databáze Snomed Postgres Sql

Podle Prohlížeč NHS CT , která nemusí být dostupná odkudkoli, 93880001 má tři rodiče:

  • Maligní nádor plic (porucha)
  • Primární maligní novotvar nitrohrudních orgánů (porucha)
  • Primární maligní novotvar dýchacích cest (porucha)

a 31 dětí:

  • Karcinom plicního parenchymu (porucha)
  • Epitelioidní hemangioendoteliom plic (porucha)
  • Non-Hodgkinův lymfom plic (porucha)
  • Nemalobuněčný karcinom plic (porucha)
  • a tak dále...

Způsob, jak najít vyšší a nižší úrovně hierarchie, je použít relationship_f.sourceid a relationship_f.destinationid . Surové tabulky však nejsou uživatelsky přívětivé, takže bych navrhoval udělat nějaké pohledy. Převzal jsem kód ze souborů Oracle .sql v toto GitHub repo.

Nejprve vytvoříme pohled s ID konceptů a preferovanými názvy:

create view conceptpreferredname as
SELECT distinct c.id conceptId, d.term preferredName, d.id descriptionId
FROM postgres.snomedct.concept_f c
inner JOIN postgres.snomedct.description_f d
  ON c.id = d.conceptId
  AND d.active = '1'
  AND d.typeId = '900000000000013009'
inner JOIN postgres.snomedct.langrefset_f l
  ON d.id = l.referencedComponentId
  AND l.active = '1'
  AND l.refSetId = '900000000000508004'  -- GB English
  AND l.acceptabilityId = '900000000000548007';

Pak uděláme pohled na vztahy:

CREATE VIEW relationshipwithnames AS
SELECT id, effectiveTime, active,
    moduleId, cpn1.preferredName moduleIdName,
    sourceId, cpn2.preferredName sourceIdName,
    destinationId, cpn3.preferredName destinationIdName,
    relationshipGroup,
    typeId, cpn4.preferredName typeIdName,
    characteristicTypeId, cpn5.preferredName characteristicTypeIdName,
    modifierId, cpn6.preferredName modifierIdName
from postgres.snomedct.relationship_f relationship,
    conceptpreferredname cpn1,
    conceptpreferredname cpn2,
    conceptpreferredname cpn3,
    conceptpreferredname cpn4,
    conceptpreferredname cpn5,
    conceptpreferredname cpn6
WHERE moduleId = cpn1.conceptId
AND sourceId = cpn2.conceptId
AND destinationId = cpn3.conceptId
AND typeId = cpn4.conceptId
AND characteristicTypeId = cpn5.conceptId
AND modifierId = cpn6.conceptId;

Dotaz na vytištění názvů a ID tří nadřazených konceptů by tedy byl:

select *
from relationshipwithnames r
where r.sourceId = '93880001'
and r.active = '1'
and r.typeIdName = 'Is a';

Všimněte si, že to ve skutečnosti vrací tři další koncepty, které online prohlížeč SNOMED považuje za zastaralé. Nejsem si jistý proč.

Chcete-li vytisknout jména a ID podřízených pojmů, nahraďte destinationId s sourceId :

select *
from relationshipwithnames r
where r.destinationId = '93880001'
and r.active = '1'
and r.typeIdName = 'Is a';

Všimněte si, že to ve skutečnosti vrací šestnáct dalších konceptů, které online prohlížeč SNOMED považuje za zastaralé. Opět nemohu najít spolehlivý způsob, jak z výsledků vyloučit pouze těchto šestnáct.

Odtud jsou dotazy k získání prarodičů a vnoučat přímočaré.




  1. MySQL – organizace obsahu databáze (Sports League)

  2. Nelze přidat sloupec z datového rámce pandas do mysql v pythonu

  3. Příklad Oracle Dynamic SQL pro vložení záznamu pomocí DBMS_SQL

  4. SQL aktualizační dotaz pomocí spojení