带表结构的SQL查询

时间:2012-02-17 16:40:58

标签: sql join database-design

我有一个数据库表结构如下:

datatype
data
mytable

现在datatype有主键datatypeid,数据表有datatypeid作为foriegn键,并且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

你能帮帮忙吗?

3 个答案:

答案 0 :(得分:1)

spitballing this,但试一试

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

答案 1 :(得分:1)

我不认为这种结构对于你想要的东西是最佳的,但如果你坚持下去......

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

我的假设

  • 有某种谓词......只是没有列出
  • 并非每个ID都有2个地址,因此如果您进行了内部联接,它们将被删除
  • mytable用于某种目的,我只是不明白为什么它来自这个例子。
  • 数据类型表的值多于address1和address2

    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 :(得分:0)

不清楚数据库的结构是什么,但我可以帮助我的建议:

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:您已将data.ID的ID(大写)放在INNER JOIN中,而SELECT放入小写的{{1}}。这可能会导致问题,我不确定。