SQL查询联盟

时间:2013-07-30 16:49:24

标签: sql

我正在尝试连接两个表并从右表中提取多个记录并将它们组合成一行。我为它做了一个SQL小提琴。我不肯定我的方法是正确的,但它是我最接近的。理想情况下,查询应显示两行: 波西 - A - 1和 咖喱 - C - 1。 Kaep应该是因为他有0。

谢谢你的期待。 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;

2 个答案:

答案 0 :(得分: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

此查询将获取在两个表中都有记录的人员的数据。据我了解,只有当{/ 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

希望这有帮助。

答案 1 :(得分: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表中存储了多个数据部分,因此您必须自行加入才能查看整个记录。您可以重新构建数据以仅使用一行,或创建单独的表来存储是或否值。虽然只要你的数据集不是很大,这样就可以了。