Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在select查询中是否可以使用同一个表两次?_Sql - Fatal编程技术网

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

Sql 在select查询中是否可以使用同一个表两次?,sql,Sql,嗨,我有以下问题,我想知道它是什么意思: SELECT c1.id as sender, c2.id as replier FROM contacts c1, contacts c2; 如何两次使用同一个表?答案很简单:使用示例中列出的查询。它应该很好用。虽然这可能是一个坏主意,但如果您想两次使用同一个表,请注意必须连接“那些”表,因为它们是不同的: SELECT c1.id as sender, c2.id as replier FROM contacts c1, contacts c

嗨,我有以下问题,我想知道它是什么意思:

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

如何两次使用同一个表?

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

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

在查询中使用一个表两次,方法是给它两个名称,如下所示

别名通常与关键字AS一起引入。通常还可以指定联接条件(如果没有联接条件,则会得到与自身联接的表的名称)。对于首选项,您使用显式联接表示法

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;

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

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

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

是的,通过给同一个表指定不同的别名,可以使用同一个表两次。我认为学习自联接将有助于您理解。

是的,您可以在同一个
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;

试试看。答案是肯定的b您没有WHERE子句的表
sender
replier
。当两个表是同一个表时,您所说的“注意您必须连接那些不同的”表是什么意思还不完全清楚。