别名派生表是两个选择的并集

jon*_*tyc 4 sql union

我无法正确地为派生表别名设置语法:

SELECT * FROM 
  (SELECT a.*, b.* 
    FROM a INNER JOIN b ON a.B_id = b.B_id
    WHERE a.flag IS NULL AND b.date < NOW()
  UNION
  SELECT a.*, b.* 
    FROM a INNER JOIN b ON a.B_id = b.B_id
    INNER JOIN c ON a.C_id = c.C_id
    WHERE a.flag IS NOT NULL AND c.date < NOW())
  AS t1
ORDER BY RAND() LIMIT 1
Run Code Online (Sandbox Code Playgroud)

我得到一个重复的列名B_id.有什么建议?

bab*_*unk 5

这个问题是不是union,它是select a.*, b.*在每个内部SELECT语句的-因为ab都有B_id列,这意味着你有两个B_id结果中的cols.

您可以通过将选择更改为以下内容来解决此问题:

select a.*, b.col_1, b.col_2 -- repeat for columns of b you need
Run Code Online (Sandbox Code Playgroud)

通常,我会避免select table1.*在您使用代码的查询中使用(而不仅仅是交互式查询).如果有人在表中添加了一列,则各种查询可能会突然停止工作.

  • @jontyc - 如果除去外部选择,那么你不使用派生表的表,它的一个简单`SELECT`正因为如此,它并不需要有不同的列名,你可以`SELECT`为你想要的许多重复列 (2认同)