我有一个数据库表结构如下:
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
你能帮帮忙吗?
答案 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)
我不认为这种结构对于你想要的东西是最佳的,但如果你坚持下去......
这样的事情可能有所帮助。(我根本没有测试过它)
我的假设
数据类型表的值多于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}}。这可能会导致问题,我不确定。