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。我正在处理的表的模式如下:
同样,这是针对学校作业的,所以我给了上述表格的只读权限。
我试图找到的是出售同一套饮料的成对酒吧(Name1,Name2)。我在做上述事情时的想法是尝试找到出售相同数量饮料的成对酒吧,然后并排列出名称和饮料(BarName1,Drink1,BarName2,Drink2)以尝试比较它们是否确实相同集。
答案 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()
:
SELECT
barName
COUNT(*) OVER(ORDER BY barName PARTITION BY barName) AS Count
FROM Sells