内部联接后数据库 table 不显示数据

Database table not showing data after inner join

我有一个 C# windows 表单应用程序,我也在使用数据库。 我有 3 个 table:PlayersTournamentsTournamentsPlayers

我只会在表格中显示 2 个 table,即 TournamentsPlayers table。 Tournaments table 有一列是一个复选框,我想在 Players table 中仅显示我选中该框的锦标赛的玩家。

当应用程序启动时,我有一个检查所有锦标赛的 foreach 语句,所以首先所有玩家都应该显示在 Players table 中,但没有显示任何玩家。

我的代码是:

private void ShowPlayersForSelectedTournaments()
        {
            string query =
                "SELECT a.Name, a.Id FROM Players a,TournamentPlayers b WHERE a.Id=b.TournamentId AND b.TournamentId=@TournamentId";
            using (Connection = new SqlConnection(ConnectionString))
            using (SqlCommand command = new SqlCommand(query, Connection))
            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
            {
                foreach (DataGridViewRow row in TournamentsTable.Rows)
                {
                    if (row.Cells.Count > 0 && bool.Parse(row.Cells[0].Value.ToString()))
                    {
                        command.Parameters.AddWithValue("@TournamentId", row.Cells[1].Value);
                        DataTable tournamentPlayersList = new DataTable();
                        adapter.Fill(tournamentPlayersList);
                        PlayersTable.DataSource = tournamentPlayersList;
                        break;
                    }
                }
            }
        }

我已经尝试了一个简单的 select 并且一切正常,但是使用 sql 语法它似乎不起作用。 我尝试了另一种类似的 mysql 语法,例如:

string query = "SELECT a.Name FROM Players a INNER JOIN TournamentPlayers b ON a.Id=b.TournamentId WHERE b.TournamentId=@TournamentId";

Players table.

中仍然没有任何显示

我做错了什么?我的 mysql 语法或代码有问题吗?

这是您的查询:

SELECT a.Name, a.Id
FROM Players a,TournamentPlayers b
WHERE a.Id=b.TournamentId AND b.TournamentId=@TournamentId;

它有多个问题。这应该有效:

SELECT p.Name, p.Id
FROM Players p JOIN
     TournamentPlayers tp
     ON tp.playerId = p.id
 WHERE tp.TournamentId = @TournamentId;

备注:

  • 从不FROM 子句中使用逗号。 始终使用正确、明确的JOIN语法。
  • 使用 table 名称的缩写,以便查询在阅读时有意义。
  • 修复 table 之间的连接条件,以匹配播放器。玩家极不可能拥有与锦标赛相同的 id and 也参加了该锦标赛。可能,但不太可能。