Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to get id of parent tables which haven't any foreign key with another table

I have a structure of a table have many fields

table_id name_table name_filed PK FK
1 person id pk
1 person name
1 person age
2 dog id pk
2 dog name
2 dog owner fk
3 phone id pk
3 phone name
3 phone owner fk

How to get id(s) of parent tables which haven’t any foreign key with another table
in this case expected result is 1

I’ve tried

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

select distinct table_id from tables_structure where fk!=''

Also I’ve tried with group by

select table_id from tables_structure where fk!=''
group by table_id 
having fk!=''

>Solution :

The first issue is that you are comparing to an empty string, generally we expect the empty value to be represented by a null value, so try comparing using IS NULL

select distinct table_id from tables_structure where fk IS NULL

But that isn’t likely to help you here, your data represents an UNPIVOT structure, your second attempt would work if you used a COUNT in your HAVING clause, here we don’t even have to compare nulls because COUNT will exclude nulls for us!

select table_id 
from tables_structure
group by table_id 
having COUNT(fk) = 0

If the values really are empty strings, and not nulls, then we can still use count with nulls by treating '' as a null value using NULLIF:

select table_id 
from tables_structure
group by table_id 
having COUNT(NULLIF(fk,'')) = 0

We can’t just filter by fk <> '' as that will modify the dataset and return ALL records.

You can use a SUM over a CASE statement that computes a 1 or 0 for each record, but now things are getting complicated:

select table_id 
from tables_structure
group by table_id 
having SUM(CASE fk WHEN '' THEN 0 ELSE 1)) = 0
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading