SQL-запрос со структурой таблицы - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть структура таблицы базы данных следующим образом:

datatype
data
mytable

теперь тип данных имеет первичный ключ datatypeid, таблица данных имеет тип данных datatypeid в качестве внешнего ключа и mytable id в качестве внешнего ключа.

InТип данных У меня есть столбец с названием description, который имеет address1, address2 и т. д.

И значения этих адресов хранятся в таблице данных, используя тип данных в качестве ссылки.

Поэтому я хочу сделать оператор выборачтобы показать идентификаторы из mytable и address1, address2 и т. д. в виде столбцов со значениями, полученными из 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 ]

1 голос
/ 17 февраля 2012

плеваться этим, но попробуйте

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 голос
/ 17 февраля 2012

Я не думаю, что эта структура является оптимальной для того, что вы хотите, но если вы застряли с ней ....

что-то вроде этого может помочь. (Я не проверял это вообще)

Мои предположения

  • существует какой-то предикат ... просто нет в списке
  • не каждый идентификатор имеет 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, потому что он не будет работать в производственной среде с большим количеством строк

0 голосов
/ 17 февраля 2012

Не очень хорошо понимаю, какова структура вашей базы данных, но я могу помочь с моим предложением:

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 с идентификатором (заглавными буквами) в INNER JOIN и в SELECT, которые вы указали в нижнем регистре. Это может вызвать проблему, я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...