【问题标题】:SQL query with table structure具有表结构的 SQL 查询
【发布时间】:2012-03-09 01:56:34
【问题描述】:

我的数据库表结构如下:

datatype
data
mytable

现在数据类型有主键datatypeid,数据表有datatypeid作为外键,mytable id作为外键。

在数据类型中,我有一个名为 description 的列,其中包含 address1、address2 等

这些地址的值存储在数据表中,使用 datatypeid 作为参考。

所以我想创建一个 select 语句来显示来自 mytable 和 address1、address2 等的 id 作为列,其值来自 data.values,如下所示:

id address1  address2
1  test add  test add2
2  test add  test add2
2  test add  test add2

这是我目前的查询,但它以不同的格式输出:

SELECT     id
FROM       datatype 
INNER JOIN data ON datatype.DataTypeID = data.DataTypeID 
INNER JOIN mytable ON data.ID = mytable.ID

编辑:
表结构:

datatype 
  -datatypeid int
  -description varchar(50)
data
  -id int
  -datatypeid int
  -datavalue varchar(50)
  -mytableid int
mytable
  -mytableid int
  -datecreated datetime

样本数据

datatype :
datatypeid  description
1           address1
2           address2

data :
id datatypeid datavalue        mytableid
1   1         george street     1

mytable:
mytableid datecreated
1         2012-02-17 10:06:02.507

你能帮忙吗?

【问题讨论】:

  • 这完全不清楚。请展示所涉及的表格的结构和一些示例数据。
  • 如果我理解正确,您希望数据类型中的所有描述都成为此查询的列名,然后此查询的数据来自数据表。这是正确的吗?
  • 如果数据类型中有静态行数,我可以帮助您(您可以使用 case 语句来填充列)。但是,如果数据类型中的行数是动态的,我想不出一种将行数据设置为列的好方法
  • @peroija 数据类型表是静态的

标签: sql join database-design


【解决方案1】:

我不认为这种结构最适合你想要的,但如果你坚持下去......

这样的事情可能会有所帮助。(我根本没有测试过)

我的假设

  • 有某种谓词...只是没有列出
  • 并非每个 id 都有 2 个地址,因此如果您进行内部连接,它们将被消除
  • mytable 有一些用途,我只是不明白为什么它在示例中。
  • 数据类型表的值比地址1和地址2多

    WITH address1 as (
    SELECT id,datavalue
    FROM data
    WHERE datatypeid = <datatypeid for addr1>
    ),
    address2 as(
    SELECT id,datavalue
    FROM data
    WHERE datatypeid = <datatypeid for addr2>
    )
    SELECT d.id,
    a1.datavalue as address1,
    a2.datavalue as address2
    FROM data d
    LEFT OUTER JOIN address1 a1 
    ON d.id = a1.id
    LEFT OUTER JOIN address2 a2
    ON d.id = a2.id
    

再次,您可能必须对 sql 进行一些调整,因为它无法在具有大量行的生产环境中执行

【讨论】:

    【解决方案2】:

    吐口水,但试一试

    SELECT m.mytableid, CASE WHEN dt.datatypeid = 1 AND d.datatypeid =1 THEN d.datavalue ELSE null END AS "address1"
        , CASE WHEN dt.datatypeid = 2 AND d.datatypeid =2 THEN d.datavalue ELSE null END AS "address2"
        ,m.datecreated    
    FROM datatype dt inner join
        data d on dt.datatypeid = d.datatypeid inner join
        mytable m on d.mytableid = m.mytableid
    

    【讨论】:

      【解决方案3】:

      不太了解您的数据库的结构,但我可以提供建议:

      SELECT     B.id
      FROM       datatype A INNER JOIN
                            data B ON datatype.DataTypeID = data.DataTypeID INNER JOIN
                            mytable C ON data.ID = mytable.ID
      

      这有助于确保属性之间没有冲突。

      RQ:您已将带有 ID(大写)的 data.ID 放入 INNER JOINSELECT 您已放入小写。这可能会导致问题,我不确定。

      【讨论】:

      • 查看我的 edi 了解表结构
      • 您的要求总是不清楚,请尽量明确您的需求。
      • So i want to make a select statement to show the ids from mytable and address1, address2 etc as columns, with the values coming from data.values as follow:不够清楚
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多