如果在另一个表中多个重复一个id,如何只选择1行

时间:2017-06-22 04:44:01

标签: c# sql sql-server database datagridview

我有3张桌子:

1-合同    -contracts_id    -subject_contract    -case_id

contracts_id  |  subject_contract  |  case_id
001           |  name              |  01
002           |  name              |  02
003           |  name              |  01

2-contracts_files    -contracts_id    -file_data

contracts_id  |  file_data
001           |  image <varbinary(MAX)>
002           |  image <varbinary(MAX)>
001           |  image <varbinary(MAX)>
002           |  image <varbinary(MAX)>
003           |  image <varbinary(MAX)>
003           |  image <varbinary(MAX)>

3例    -案例ID    -case_name

case_id  |  case_name
01       |  case one
02       |  case two

需要在dataGridView中输出如下:

contracts_id  |  subject_contract  |  case_name  |  file_data  |  file_data 
001           |  name              |  case one   |  image      |  image 
002           |  name              |  case two   |  image      |  image 
003           |  name              |  case one   |  image      |  image 
  • 让所有图片在一行中有一个contract_id(如果合同001有2张图片将它们排成一行)

我试试这个:

create proc GET_ALL_CONTRACTS
as
SELECT contracts.[contracts_id]
      ,[subject_contract]
      ,[case_name] 
      ,[file_data]
FROM contracts, contracts_files
  Contracts INNER join Cases
  ON Cases.case_id = Contracts.case_id 
where contracts_files.contracts_id = Contracts.contracts_id

1 个答案:

答案 0 :(得分:0)

我认为我和我参与过的一个项目有类似的情况。

您需要做的是使用存储过程和外国人密钥将多个表中的所有列组合到一个表中。确保首先获得唯一列,然后将记录与它们链接起来。

我们以您的架构为例,我们将创建一个新表并将其命名为ContractsMain,它将包含以下列:

[ID] | [ContractsID] | [SubjectContract] | [ContractsFileData] | [CaseID] | [CaseName]

现在,我们将创建一个存储过程,该过程将从每个表中获取要插入每列的记录。 示例:

ContractID = ( SELECT ContractsMain.ContractsID 
               FROM ContractsMain
               INNER JOIN Contracts ON Contracts_ID = ContractsMain.ContractsID       ),

SubjectContract = ( SELECT ContractsMain.SubjectContract
                    FROM ContractsMain
                   INNER JOIN Contracts ON Contracts_ID = ContractsMain.ContractsID   ),

因此,您将在每个列上执行相同的方法,并在每个列上添加您的函数和条件,并让程序根据您的条件更新和更改表。

然后,您创建一个新视图并添加ContractsMain表,并选择您需要查看的列。

任何需要ContractsMain所没有的新列的新视图,您只需将列添加到ContractsMain中并重复上述过程。

我主要在需要两个以上表的Reports和Views上执行此操作。其中将记录组织在一个地方并且更具可读性。将主表和记录放在一边并且不受影响,如果主表(新记录,修改等等)有任何变化,这将自动在ContractsMain中更新。