How to organise this data within WordPress

Another perspective.

Instead of using the two custom-post-type ‘team’ and ‘player’. You can use them as a single custom-post-type ‘participant’.

Participant itself is a hierarchical post type, teams as the first level and player as it’s child. That way there wouldn’t be a player with more than 1 teams.

If you are doing your own theme, you can make a conditional, checking if($post->post_parent)

The custom-post-type can be assigned to a ‘competition’ taxonomy, preferably not hierarchical.

Hope this help