2013-07-30 55 views
0

我试图加入两个表,并从右表中拉出多个记录,并将它们合并为一行。我为它做了一个SQL小提琴。我不积极,我的方法是正确的,但它是最接近的。理想情况下,查询应显示两条线: 波西 - A - 1和 咖喱 - C - 1 Kaep应该出,因为他有0SQL查询联盟

感谢您寻找。 SQL Fiddle

下面是描述的相关细节:

2表格提供了一个人,一个登记。注册时注册时每个人的选择都有行(即注册类型和是/否回答)。 regtype和yesno条目都会切换,让我知道该记录何时被存储。我想知道Person的详细信息和他们的RegistrationType以及是否为YesNoEntry选择了Yes。

下面是表的结构和一些虚拟刀片:

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; 

既然你存储在REG表中的数据的多个部分,你必须自己加入到查看整个记录。您可以重构数据以仅使用一行,或者创建单独的表来存储yes或no值。尽管只要你的数据集不是很大,这将工作得很好。

+0

完美,谢谢!由于行数是动态的,我无法将它全部存储在同一行上。管理员创建存储在不同表中的表单,这些表单是表单中的条目。这正是我所期待的。不知道你可以自己加入,但它是有道理的。 – user2634997

0

检查您SQLFiddle例子,我认为你不需要UNIONJOIN

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 

这个查询将得到中有记录的人的数据均为表。据我了解,只有已经有regPerson的记录,一个人可以在reg有记录。

如果你想重复数据删除列表,并只显示名称,你可以做这样的事情:

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 

希望这有助于。