是否可以在选择查询中使用同一个表两次?

时间:2011-09-12 05:47:07

标签: sql

您好我有以下查询,我想知道这意味着什么:

SELECT c1.id as sender, c2.id as replier
   FROM contacts c1, contacts c2;

如何两次使用同一张表?

5 个答案:

答案 0 :(得分:14)

在查询中使用一个表两次,给它两个名称,就像那样。

通常使用关键字AS引入别名。您通常也会指定一个连接条件(如果没有它,则会得到与自身连接的表的Cartesian Product)。您首选使用显式JOIN表示法。

SELECT c1.id AS sender, c2.id AS replier
  FROM contacts AS c1
  JOIN contacts AS c2 ON c1.xxx = c2.yyy;

在此示例中,不清楚哪些列可能用于连接;我们没有任何信息可以帮助解决这个问题。

通常情况下,还有另一个表作为中介,例如消息表:

SELECT c1.id AS sender,  c1.email AS sender_email,
       c2.id AS replier, c2.email AS replier_email,
       m.date_time
  FROM messages AS m
  JOIN contacts AS c1 ON m.sender_id  = c1.id
  JOIN contacts AS c2 ON m.replier_id = c2.id;

答案 1 :(得分:8)

此查询创建一个包含所有可能的联系人ID对的表。

例如,如果您的联系ID为1,2和3,则会得到

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

答案 2 :(得分:2)

这是一个简单的答案:使用示例中列出的查询。它应该工作得很好。虽然这可能是一个坏主意,但如果你想两次使用同一个表,请注意你必须加入“那些”表,因为它们是不同的:

SELECT c1.id as sender, c2.id as replier
FROM contacts c1, contacts c2
WHERE sender.id = replier.id

答案 3 :(得分:1)

是的,您可以通过为表提供不同的别名来使用同一个表两次。我认为学习自我联合会帮助你理解。

答案 4 :(得分:1)

是的,您可以在同一SELECT查询中多次使用同一个表。

请注意,当表格在同一范围内出现多次时,您只需要使用表格相关名称(俗称“别名”)。例如,以下SELECT查询使用相同的表两次,但由于每个查询都位于不同的范围内(每个范围由UNION关键字分隔),因此不需要表关联名称:

SELECT id, 'Sender' AS contact_narrative
  FROM contacts
 WHERE something = 1
UNION
SELECT id, 'Replier' AS contact_narrative
  FROM contacts
 WHERE something = 2;