Объединение таблиц в SQL, где имя нового столбца основано на значении объединенной таблицы из другого столбца

Это около 7 МБ пространства стека. В визуальной студии вы должны использовать / STACK: ###, ###, чтобы отобразить нужный размер. Если вы действительно хотите получить огромный стек (это может быть хорошей причиной, используя LISP или что-то еще :), даже куча ограничена небольшими ассигнованиями, прежде чем заставить вас использовать VirtualAlloc), вы также можете настроить PE для создания с помощью / LARGEADDRESSAAWARE (компоновщик Visual Studio снова), но этот заголовок PE вашего конфигуратора позволяет вашему скомпилированному двоичному файлу обращаться к полному 4 ГБ 32-битного адресного пространства (если выполняется в WOW64). Если вы построите действительно массивные двоичные файлы, вам также, как правило, нужно будет сконфигурировать / bigobj в качестве дополнительного параметра-линкера.

И если вам все еще нужно больше места, вы можете радикально нарушить соглашение, используя что-то simular to (снова ссылка MSVC ) / merge :, который позволит вам упаковать один раздел в другой, так что вы можете использовать каждый отдельный байт для отдельного разделяемого раздела / данных. Естественно, вам также нужно будет настроить разрешения SECTIONS в файле def или с помощью #pgrama.

0
задан Chris Morris 22 January 2019 в 11:50
поделиться

3 ответа

Вы хотите изменить ключевые значения. Вы можете сделать это вручную следующим образом:

select a.*
     , max(case b.key when 'Name' then b.value end) Name
     , max(case b.key when 'DOB' then b.value end) DOB
  from TableA a
  left join TableB b
    on a.id = b.table_a_id
  group by a.id
      , a.title
      , a.date
      , a.etc

Приведенный выше запрос будет работать, если у вас есть только один из каждого атрибута для данной записи в Таблице A, в противном случае он даст вам наибольшее значение. Если вам нужно несколько значений, вы можете сгенерировать последовательность для каждого атрибута, как показано в подвыборе с именем B ниже:

select a.ID
     , b.Seq
     , a.Title
     , a.Date
     , a.Etc
     , max(case b.key when 'Name' then b.value end) Name
     , max(case b.key when 'DOB' then b.value end) DOB
  from TableA a 
  left join (select @Seq:=case
                       when @aid=b.Table_A_ID and @key=b.key
                       then @Seq + 1
                       else 1
                     end Seq
                   , @aid:=b.Table_A_ID Table_A_ID
                   , @key:=b.key `Key`
                   , b.value
                from tableB b
               order by table_a_id, b.key) b
     on a.id = b.table_a_id
  group by a.id, a.title, a.date, a.etc, b.Seq;

Это отличается от ответа @ GMB тем, что он возвратит каждый атрибут только один раз с нулями в строках, где для каждого атрибута меньше значений, тогда как решение @ GMB вернет произведение CROSS всех атрибутов для данной строки.

0
ответ дан Sentinel 22 January 2019 в 11:50
поделиться
Select a.*, 
(select TOP 1  b.DOB from b where b.table_a_id = a.id and b.key = 'dob'), 
(select TOP 1 b.ame from b where b.table_a_id = a.id and b.key = 'name') 
from a

Вы должны использовать суб-выбор для достижения этих результатов

0
ответ дан Bob Dubke 22 January 2019 в 11:50
поделиться

Это может быть достигнуто с помощью двух JOIN в Таблице B, например:

SELECT
    ta.id,
    ta.date,
    ta.etc,
    tb.value Name,
    td.value DOB
FROM
    tableA ta
    INNER JOIN tableB tb ON tb.table_a_id = tb.id AND tb.key = 'Name'
    INNER JOIN tableB td ON td.table_a_id = ta.id AND td.key = 'DOB'

В этом запросе будут отображаться только записи, которые имеют имя и DOB в таблице B. Если вы хотите избежать фильтрации этих «неполных» записей, вы можете использовать LEFT JOIN вместо INNER JOIN.

0
ответ дан GMB 22 January 2019 в 11:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: