FROM AS的SQL别名

时间:2017-10-22 06:55:23

标签: sql database postgresql alias relational-division

SELECT A.barName AS BarName1, B.barName AS BarName2
FROM (
    SELECT Sells.barName, COUNT(barName) AS count
    FROM Sells
    GROUP BY barName
) AS A, B
WHERE A.count = B.count

我试图在我创建的这个表上进行自联接,但是我不确定如何以这种格式对表进行两次别名(即FROM AS)。不幸的是,这是一项学校作业,我无法创建任何新表。任何人都有这种语法的经验吗?

编辑:为了澄清我使用PostgreSQL 8.4。我正在处理的表的模式如下:

  • 饮酒者(名称 addr ,爱好,经常)
  • 酒吧(名称,地址,所有者)
  • 啤酒(名称,啤酒,酒精)
  • 饮品( drinkerName drinkerAddr beerName ,评级)
  • 卖出( barName beerName ,价格,折扣)
  • 收藏夹( drinkerName drinkerAddr barName ,beerName,季节)

同样,这是针对学校作业的,所以我给了上述表格的只读权限。

我试图找到的是出售同一套饮料的成对酒吧(Name1,Name2)。我在做上述事情时的想法是尝试找到出售相同数量饮料的成对酒吧,然后并排列出名称和饮料(BarName1,Drink1,BarName2,Drink2)以尝试比较它们是否确实相同集。

2 个答案:

答案 0 :(得分:1)

您还没有提到您使用的RDBMS。 如果是Oracle或MS SQL,你可以这样做(我使用我的示例数据表,但你可以用你的表来尝试):

create table some_data (
  parent_id int,
  id int,
  name varchar(10)
);

insert into some_data values(1, 2, 'val1');
insert into some_data values(2, 3, 'val2');
insert into some_data values(3, 4, 'val3');

with data as (
select * from some_data 
)
select * 
from data d1 
left join data d2 on d1.parent_id = d2.id

在您的情况下,此查询

SELECT Sells.barName, COUNT(barName) AS count
FROM Sells
GROUP BY barName

应放在WITH节中,并从主查询中引用2次作为A和B.

答案 1 :(得分:0)

稍微不清楚你想要实现的目标。您是否正在寻找列表栏名称,以及它们在表格中出现的次数?如果是这样,有几种方法可以做到这一点。首先:

SELECT SellsA.barName AS BarName1, SellsB.count AS Count
FROM 
(
    SELECT DISTINCT barName
    FROM Sells 
) SellsA
LEFT JOIN 
(
    SELECT Sells.barName, COUNT(barName) AS count
    FROM Sells
    GROUP BY barName
) AS SellsB
ON SellsA.barName = SellsB.barName

其次,如果您使用的是MSSQL:

SELECT barNamr, MAX(rn) AS Count
FROM
(
SELECT  barName,
        ROW_NUMBER() OVER(ORDR BY barName PARTITION BY barName) as rn
FROM Sells
) CountSells
GROUP BY barName

第三,您可以使用OVER()

来避免在MSSQL中自我加入
SELECT
        barName
        COUNT(*) OVER(ORDER BY barName PARTITION BY barName) AS Count
FROM Sells