具有表结构的SQL查询

具有表结构的SQL查询,sql,join,database-design,Sql,Join,Database Design,我的数据库表结构如下: datatype data mytable id address1 address2 1 test add test add2 2 test add test add2 2 test add test add2 现在datatype有主键datatypeid,数据表有datatypeid作为外键,mytable id作为外键 在数据类型中,我有一个名为description的列,它有address1、address2等 这些地址的值以datatypeid

我的数据库表结构如下:

datatype
data
mytable
id address1  address2
1  test add  test add2
2  test add  test add2
2  test add  test add2
现在datatype有主键datatypeid,数据表有datatypeid作为外键,mytable id作为外键

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

这些地址的值以datatypeid作为参考存储在数据表中

因此,我想做一个select语句,将mytable和address1、address2等的ID显示为列,其值来自data.values,如下所示:

datatype
data
mytable
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
样本数据


你能帮忙吗?

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

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放在内部联接中,而在SELECT中,您已经将ID为小写。这可能会导致问题,我不确定。

吐出这个,但是试试看

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

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

像这样的东西可能会有帮助。我根本没有测试过它

我的假设

有一些谓词…只是没有列出 并不是每个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进行一些调整,因为它不会在一个有很多行的生产环境中执行,而这些行是完全不清楚的。请显示所涉及表的结构和一些示例数据。如果我理解正确,您希望datatype中的所有描述成为此查询的列名,然后此查询的数据来自数据表。这是正确的吗?如果数据类型中的行数是静态的,我可以帮助您解决这个问题,您可以使用case语句来填充列。然而,如果数据类型中的行数是动态的,我想不出一个好方法来将该行数据设置为动态的columns@peroija数据类型表是静态的请参阅my edi for table Structure您的请求总是不清楚,请尝试进一步澄清您的需要。因此,我想做一个select语句来显示mytable和address1中的ID,address2等作为列,值来自数据。值如下:不够清晰