【问题标题】:How to replace the IDs with their corresponding values in SQL?如何在 SQL 中将 ID 替换为其对应的值?
【发布时间】:2015-08-03 19:08:22
【问题描述】:

我在 4 张桌子上工作,1 张主桌子和 3 张小桌子。主表称为“文档”,它引用了其他 3 个小表中的每一个的引用和 ID:重要性、性质、访问级别。

e.g.

(Table1) document

document_id | title | file_name | importance_id | nature_id | access_level_id
-----------------------------------------------------------------------------
      1     | Food  | food.docx |       1       |     1     |       1        


(Table2) importance

importance_id | name
--------------------
       1      | High


(Table3) nature

nature_id | name
----------------
     1    | General


(Table4) nature

access_level_id | name
----------------------
        1       | Public

我想做的是显示所有文档(使用 SELECT),并将其 ID 替换为相应的名称。像这样:

document_id | title | file_name | importance |  nature  | access_level
-----------------------------------------------------------------------------
      1     | Food  | food.docx |    High    |  General |    Public        

我尝试使用此查询,但效果不佳:

SELECT `document_id`, `title`, `file_name`, `date_of_archiving`, `duration_of_life`, importance.name as importance, nature.name as nature, access_level.name as access_level
FROM document, importance, nature, access_level
WHERE importance.importance_id = document.document_id
AND nature.nature_id = document.nature_id
AND access_level.access_level_id = document.access_level_id;

那么我怎样才能做到这一点呢?

提前致谢:)

【问题讨论】:

  • 看来你的问题在这里importance.importance_id = document.document_id...这是JOIN 语法优越的众多原因之一。
  • @Uueerdo 是的,WHERE 命令出于某种原因消除了一些行。问题是我不知道如何编写正确的 JOIN 语法,如果您能告诉我如何编写,我将不胜感激:)
  • 这是 MySQL 还是 Microsoft SQL Server?你已经标记了两者。

标签: mysql sql sql-server sql-server-2008


【解决方案1】:

使用此代码:

SELECT
  Document_id,
  Title,
  File_name,
  i.name AS Importance,
  n.name AS Nature,
  s.name AS Access_level
FROM Document d
INNER JOIN importance i ON i.importance_id = d.importance_id
INNER JOIN nature n     ON n.nature_id = d.nature_id
INNER JOIN nature s     ON s.access_level_id = d.access_level_id

【讨论】:

    【解决方案2】:

    如果您希望行不返回空值,请使用内连接

    SELECT 
      document_id, 
      title, 
      file_name, 
      date_of_archiving, 
      duration_of_life, 
      i.NAME AS [importance],
      n.name as [nature], 
      al.name as [access_level]
    FROM 
      DOCUMENT D
      INNER JOIN importance i ON i.Importance_id = D.importance_id
      INNER JOIN nature n ON n.nature_id = D.nature_id
      INNER JOIN access_level al on al.access_level_id = D.access_level_id
    

    【讨论】:

      【解决方案3】:

      使用 JOINS 而不是您正在使用的过时语法。它更清晰,更容易调试。并且为了节省打字使用表别名。如下:

      SELECT 
        document_id, 
        title, 
        file_name, 
        date_of_archiving, 
        duration_of_life, 
        i.NAME AS [importance],
        n.name as [nature], 
        al.name as [access_level]
      FROM 
        DOCUMENT D
        JOIN importance i ON i.Importance_id = D.importance_id
        JOIN nature n ON n.nature_id = D.nature_id
        JOIN access_level al on al.access_level_id = D.access_level_id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        相关资源
        最近更新 更多