2017-09-01 197 views
0

我有兩個SQL的表是這樣的:如何選擇沒有特定條目的條目?

T1

Animal Name 
Cat  Paul 
Cat  Miau 
Cat  Paul 
Cat  Peter 

T2

Legs Name 
4  Paul 
4  Miau 
3  Paul 
4  Peter 

我想有像這樣的表:

Animal Legs Name 
Cat  4  Miau 
Cat  4  Peter 

我想讓所有的動物具有特定數量的腿,但不是當我們有兩隻相同的貓時名稱。

我試着做一些這樣的:

select a.animal, b.legs, a.name 
from animallistA as a join animallistB as b 
on a.name = b.name 
where b.legs = 4 and not b.legs = 3 
group by a.animal, b.legs, a.name 

如果我說where b.legs = 4然後我還會收到「保羅」,但如果我說我where b.legs = 4 and not b.legs = 3收到什麼都沒有。

有沒有辦法不接受誰具有相同的名稱和4條腿,但不是一個具有相同的名稱,但4個或更少(或更多)的腿的貓。

+1

你使用MySQL或MS SQL Server?不要標記不涉及的產品。 – jarlh

+0

格式提示:跳過'
'標籤等。編輯時,標記代碼並點擊'{}'。 – jarlh

+1

[MySQL的](https://dev.mysql.com/doc/refman/5.7/en/)和[SQL服務器](https://docs.microsoft.com/en-us/sql/t-sql/語言參考)是由不同公司生產的不同軟件包。即使它們都實現SQL,它們也會以不同的方式擴展它們,有時它們會使用不同的語法約定來使查詢在它們之間不兼容。請僅使用與您使用的軟件相匹配的標籤。 – axiac

回答

1

NOT EXISTS可以做的工作。

SELECT t1.animal, t2.legs, t2.name 
FROM t1 
JOIN t2 ON t1.name = t2.name 
WHERE t2.legs = 4 AND 
     NOT EXISTS 
     (
      SELECT 1 FROM t2 WHERE t2.name = t1.name AND t2.legs != 4 
    ) 
+0

HI,我想這一個,但我也收到貓+ 4 +保羅。我不想收到他。但是,謝謝。我會馬上改變它。 –

1

您可以先取得4條腿動物的所有獨特名稱(來自子查詢),然後加入主表以獲得所需結果。

select a.animal, b.legs, a.name from animallistA as a join 
    (select name,max(legs) legs from animallistB group by name having count(distinct legs)=1) as b 
    on a.name = b.name and b.legs=4 

從子查詢中我們可以得到結果

Legs Name 
4  Miau 
4  Peter 

由於具有條件不同的值失敗Paul。加入這個與主表給人的請求的結果

+0

您可以發佈您的輸出PLS? – etsa

+0

@etsa PLZ檢查我的回答(我已經改變了其具有獨特的條件) – Rams

+0

是現在的作品(但它似乎對我來說,比明更重要的是移動WHERE腿= 4的條件和在變換它,B.LEGS = 4 :-) – etsa

0

,據我理解你的問題,我建議以下查詢:

SELECT A.ANIMAL, A.NAME, B.LEGS 
FROM ANIMALLISTA A 
INNER JOIN ANIMALLISTB B ON A.NAME = B.NAME 
LEFT JOIN (SELECT NAME, COUNT(*) AS RC FROM ANIMALLISTB GROUP BY NAME) C ON A.NAME = C.NAME 
WHERE B.LEGS=4 
AND C.RC=1 

輸出:

ANIMAL NAME LEGS 
Cat Miau 4 
Cat Peter 4 
+0

什麼是左邊,請先加入,如果你給的條件上,在where子句 – Rams

+0

如果有人仍對查詢工作,這是比較容易的結果。我不認爲它改變了一些東西。無論如何,是的,在最終版本,一個可以寫INNER JOIN,而不是留在我的查詢的第四行JOIN。 – etsa

+0

我想正是因爲你說的,但我得到了{貓+ 4 +彼得} ....也 –

0

你可能想嘗試這樣的事情,在My SQL 8.0.2 ||上爲我工作cat_1 = T1和cat_2 = T2

WITH CTE AS 
(
SELECT distinct * 
FROM cat_1 
INNER JOIN cat_2 ON cat_1.names=cat_2.name 
), 

SCTE AS 
(
SELECT CTE.animal, 
CTE.legs, 
CTE.names, 
COUNT(CTE.names) over(PARTITION BY CTE.names) as Count 
from CTE 
) 

SELECT 
SCTE.animal, 
SCTE.legs, 
SCTE.names 
FROM SCTE 
WHERE legs = 4 
AND Count = 1; 

輸出:

animal legs names 
Cat  4  Miau 
Cat  4  Peter