2013-07-30 4 views
0

Я пытаюсь объединить две таблицы и вытащить несколько записей из правой таблицы и объединить их в одну строку. Я сделал для него скрипт SQL. Я не уверен, что мой подход правильный, но он самый близкий. В идеале запрос должен показать две строки для: Поузи - A - 1 и Curry - C - 1. Kaep должен быть вне потому что он имеет 0.SQL Query Union

Спасибо для смотреть. SQL Fiddle

Вот соответствующие детали, описанные:

2 стола для человека и регистрации. При регистрации регистрируются строки для каждого из выбранных лиц (т. Е. Тип регистрации и ответ «да/нет»). Как записи regtype, так и yesno имеют переключатели, чтобы сообщить мне, когда эта запись хранится. Я хочу знать детали Person в сочетании с их RegistrationType, и если они выбрали Yes для YesNoEntry.

Вот структура таблицы и некоторые фиктивные вставки:

CREATE TABLE RegPerson (
    RegPersonID INT, 
    FirstName VARCHAR(32), 
    LastName VARCHAR(32), 
    Company VARCHAR(32), 
    Dummy1 INT 
); 

CREATE TABLE Reg (
    RegID INT, 
    RegPersonID INT, 
    RegItemID INT, 
    RefNumber INT, 
    RegistrationToggle BINARY, 
    RegistrationType VARCHAR(32), 
    YesNoToggle BINARY, 
    YesNoEntry BINARY, 
    Dummy2 VARCHAR(32), 
    Dummy3 BINARY 
); 

INSERT INTO RegPerson 
      SELECT 1, 'Buster', 'Posey', 'Giants', 456 
UNION ALL SELECT 2, 'Colin', 'Kaepernick', '49ers', 765 
UNION ALL SELECT 3, 'Stephen', 'Curry', 'Warriors', 321; 

INSERT INTO Reg 
      SELECT 1, 1, 1, 98765, 0, '', 0, 0, 'asdf', 1 
UNION ALL SELECT 2, 1, 2, 98765, 1, 'A', 0, 0, 'qwer', 0 
UNION ALL SELECT 3, 1, 3, 98765, 0, '', 1, 1, 'rtyu', 1 
UNION ALL SELECT 4, 2, 1, 12345, 0, '', 0, 0, 'jkl;', 0 
UNION ALL SELECT 5, 2, 2, 12345, 1, 'B', 0, 0, 'cvnb', 1 
UNION ALL SELECT 6, 2, 3, 12345, 0, '', 1, 0, 'zxcv', 0 
UNION ALL SELECT 7, 3, 1, 56789, 0, '', 0, 0, 'poiu', 0 
UNION ALL SELECT 8, 3, 2, 56789, 1, 'C', 0, 0, 'cvnb', 1 
UNION ALL SELECT 9, 3, 3, 56789, 0, '', 1, 1, 'zxcv', 0; 
+6

Пожалуйста, добавьте всю релевантную информацию в вопрос. Если SQLFIddle недоступен, ваш вопрос бесполезен. –

+0

Понял, спасибо. Просто обновлен с подробностями. – user2634997

ответ

0

Этот запрос дает вам строки, которые вы хотите:

select a.refnumber, 
     c.firstname, 
     c.lastname, 
     c.company, 
     a.registrationtype, 
     b.yesnoentry 
from reg a, reg b, regperson c 
    where a.refnumber=b.refnumber 
    and a.regpersonid=c.regpersonid 
    and a.registrationtype !='' 
    and b.yesnotoggle=1 
    and b.yesnoentry=1; 

Поскольку вы хранение нескольких частей данных в таблице Изотерм, вы должны самостоятельно зарегистрироваться, чтобы просмотреть все записи. Вы можете перестроить свои данные, чтобы использовать только одну строку, или создать отдельную таблицу для хранения значений да или нет. Хотя пока ваш набор данных не огромен, это будет работать нормально.

+0

Отлично, спасибо! Я не могу сохранить все это в той же строке, потому что количество строк является динамическим. Администратор создает форму, которая хранится в другой таблице, и это записи в форму. Это именно то, что я искал. Не знал, что вы можете присоединиться к себе, но это имеет смысл. – user2634997

0

Проверка SQLFiddle пример, я думаю, что вам не нужно UNION но JOIN:

SELECT 
    Reg.RefNumber, 
    RegPerson.FirstName, 
    RegPerson.LastName, 
    RegPerson.Company, 
    Reg.RegistrationType, 
    Reg.YesNoEntry 
FROM 
    Reg 
    INNER JOIN RegPerson ON RegPerson.RegPersonID = Reg.RegPersonID 
WHERE 
    Reg.RegItemID = 3 
    Reg.YesNoToggle = 1 
    AND Reg.YesNoEntry = 1 

Этот запрос будет получить данные лиц, имеющих запись в и таблиц. Как я понимаю, у человека может быть запись в reg, только если у него есть запись в regPerson.

Если вы хотите дедуплицировать список и показать только имена, вы могли бы сделать что-то вроде этого:

SELECT DISTINCT 
    RegPerson.FirstName, 
    RegPerson.LastName, 
    RegPerson.Company, 
FROM 
    Reg 
    INNER JOIN RegPerson ON RegPerson.RegPersonID = Reg.RegPersonID 
WHERE 
    Reg.RegItemID = 3 
    Reg.YesNoToggle = 1 
    AND Reg.YesNoEntry = 1 

Надеется, что это помогает.