簡體   English   中英

SQL查詢不同的內部聯接問題

[英]SQL Query Distinct Inner Join Issue

以下SQL INNER JOIN語句出現問題。 我可能在語法上缺少一些東西:

SELECT * from
(SELECT DISTINCT Name from Table.Names WHERE Haircolor='Red') uniquename
INNER JOIN
(SELECT * FROM Table.Names) allnames
ON uniquenames.Name = allnames.Name;

我想要所有具有“紅色”發色的名稱,但是我不需要任何重復的名稱。

NAME        HAIRCOLOR       ADDRESS   PHONE       EMAIL
-----       ---------       -------  -----       -----
Joe         Red          123 Street  20768422    blah@example.com
Joe         Red         828 Street   703435422   blah4@example.com
Joe         Red         165 Street   10768422    blah3@example.com
Jamie       Blond       4655 Street  10568888    blah3@example.com
John        Brown       941 Street   40768422    blah5@example.com
Josephine   Red         634 Street   43444343    blah2@example.com
Josephine   Red         394 Street   43414343    blah7@example.com

查詢應返回:

NAME        HAIRCOLOR       ADDRESS   PHONE       EMAIL
-----       ---------       -------  -----       -----
Joe         Red          123 Street  20768422    blah@example.com
Josephine   Red         634 Street   43444343    blah2@example.com

也許涉及GROUP BY?

可能是:

select * from
(SELECT DISTINCT Name from Names WHERE Haircolor='Red') uniquenames
INNER JOIN
(SELECT * FROM Names) allnames
ON uniquenames.Name = allnames.Name

-這取決於您實際想要看到的內容。

更新:SQLFiddle 此處為原始答案。

但是,更好的答案(如果使用MySQL)可能是:

select * from Names WHERE Haircolor='Red' group by Name

(請注意,為每個與頭發顏色匹配的名稱返回的特定行本質上是隨機的。)

SQLFiddle 在這里

進一步更新:對於SQLServer,請嘗試:

with cte as
(select n.*, row_number() over (partition by name order by address) r
 from Names n WHERE Haircolor='Red')
select NAME, HAIRCOLOR, ADDRESS, PHONE, EMAIL 
from cte where r=1

-這將返回每個名稱的第一行(按地址,按字母順序)-SQLFiddle here

這是ROW_NUMBER查詢的示例。 我目前無法測試,因此可能需要解決一些錯誤。 但是,為了讓您有一個大致的了解,它從這樣的查詢開始:

select
  t.*,
  row_number() over (partition by name order by address) as rn
from
  table t
where
  haircolor = 'red'

這為每個紅發提供了一行,並增加了列rn ,該列給出了具有相同name每組行內的順序號。

然后,要從每個組中獲取第一個,只需添加一個外部查詢以從第一個查詢中選擇rn=1

select * from (
  select
    t.*,
    row_number() over (partition by name order by address) as rn
  from
    table t
  where
    haircolor = 'red'
)
where rn=1
SELECT * FROM names WHERE haircolor = 'red' GROUP BY name ORDER BY email ASC/DESC

從原始帖子中,我看到您似乎正在將一張桌子連接到自身上,我根本看不到您為什么這樣做

根據您的加入,有一些評論/答案,我認為這可能會使您感到困惑。 您的查詢過於復雜。

如果您碰巧有兩個表,客戶和客戶功能/服務,那么我可以理解為什么您需要加入。 但是對於單個表,您就不需要它。

根據評論更新

SELECT DISTINCT name, haircolor, address, phone, email FROM names WHERE haircolor = 'red'

如果返回結果無關緊要,那么這應該做您所需要的。 每個返回的行都應該有一個不同的“名稱”,因此您應該只返回兩行,我沒有測試過,但是可以嘗試一下。

這是小提琴, http: //sqlfiddle.com/#!2 / cc2e4 / 7

基於OP的注釋的UPDATE :如果您希望該名稱僅出現一次,則需要在其他字段上有一個聚集子句,並按名稱分組。

SELECT Name, MAX(Address), MAX(PhoneNumber)--, MAX(YourDesiredColumnHere)
FROM Table.Names 
WHERE Name IN (
      SELECT Name 
      FROM Table.Names 
      WHERE Haircolor = 'RED')
GROUP BY 
    Name

除了這一點

Table.Names

看起來錯了,為什么你不能這樣做:

SELECT * from Table.Names WHERE Haircolor='Red'

我想念什么嗎?

您在OP中的查詢是一種非常round回的說法

Select * From Names Where HairColor = 'Red'

將distinct子查詢連接回原始表基本上可以使distinct關鍵字無效。 您能否提供有關所需內容的更多信息? 一個例子是最好的。

兄弟,請嘗試刪除您的大括號,希望下面的查詢能夠解決您的查詢

SELECT DISTINCT Name from Table.Names
INNER JOIN (SELECT * FROM Table.Names) allnames
ON uniquenames.Name = allnames.Name
WHERE Haircolor='Red 

如果您不在乎想要的願望行,我會做類似的事情。

   SELECT tblName.* 
   FROM Table.Names as tblName
   INNER JOIN ( SELECT Name ,HairColor, MIN(Email)
                FROM Table.Names
                WHERE Haircolor='Red'
                GROUP BY Name ,HairColor) as tmp ON ( tmp.Email = tblName.Email)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM